var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
ব্যাখ্যা
ইমট্যটেবল.জেএস সংগ্রহগুলি আপডেট করা সর্বদা আসল অপরিবর্তিত রেখে col সংকলনের নতুন সংস্করণ ফিরিয়ে দেয়। সে কারণে আমরা জাভাস্ক্রিপ্টের list[2].count = 4
মিউটেশন সিনট্যাক্স ব্যবহার করতে পারি না । পরিবর্তে আমাদের জাভা সংগ্রহের ক্লাসগুলির মতোই পদ্ধতিগুলি কল করতে হবে।
আসুন একটি সহজ উদাহরণ দিয়ে শুরু করা যাক: কেবলমাত্র একটি তালিকার গণনা।
var arr = [];
arr.push(2);
arr.push(1);
arr.push(2);
arr.push(1);
var counts = Immutable.List.of(arr);
এখন যদি আমরা 3 য় আইটেম আপডেট করতে চেয়েছিলেন, একটি প্লেইন জাতীয় অ্যারের অনুযায়ী প্রদর্শিত হবে: counts[2] = 4
। যেহেতু আমরা মিউটেশনটি ব্যবহার করতে পারি না, এবং পরিবর্তে আমরা ব্যবহার করতে পারি একটি পদ্ধতি কল করা দরকার: counts.set(2, 4)
- এর অর্থ 4
সূচকে মান নির্ধারণ করে 2
।
গভীর আপডেট
আপনি যে উদাহরণ দিয়েছেন তাতে নেস্টেড ডেটা রয়েছে। আমরা কেবল set()
প্রাথমিক সংগ্রহটি ব্যবহার করতে পারি না ।
ইমট্যটেবল.জেএস সংগ্রহের একটি পদ্ধতি রয়েছে যার নাম "ইন" দিয়ে শেষ হয় যা আপনাকে নেস্টেট সেটে আরও গভীর পরিবর্তন আনতে দেয়। সর্বাধিক সাধারণ আপডেটিং পদ্ধতিগুলির সাথে সম্পর্কিত "ইন" পদ্ধতি রয়েছে। উদাহরণস্বরূপ set
আছে setIn
। প্রথম যুক্তি হিসাবে কোনও সূচক বা কোনও কীকে গ্রহণ করার পরিবর্তে, এই "ইন" পদ্ধতিগুলি একটি "মূল পথ" গ্রহণ করে। মূল পথটি সূচক বা কীগুলির একটি অ্যারে যা আপনার আপডেট করতে চান এমন মান কীভাবে পাবেন তা চিত্রিত করে।
আপনার উদাহরণস্বরূপ, আপনি সূচী 2 তে তালিকার আইটেমটি আপডেট করতে চেয়েছিলেন এবং তারপরে সেই আইটেমের মধ্যে কী "গণনা" তে মান। তাই মূল পথ হবে [2, "count"]
। setIn
পদ্ধতির দ্বিতীয় প্যারামিটারটি ঠিক ঠিক এর মতোই কাজ করে set
, এটি সেখানে আমরা নতুন মান রাখতে চাই, সুতরাং:
list = list.setIn([2, "count"], 4)
সঠিক কী পথটি সন্ধান করা হচ্ছে
আরও এক ধাপ এগিয়ে, আপনি আসলে বলেছিলেন যে আপনি যে আইটেমটি "থ্রি" নামের আইটেমটি আপডেট করতে চান যা কেবল ২ য় আইটেমের চেয়ে আলাদা। উদাহরণস্বরূপ, সম্ভবত আপনার তালিকাটি বাছাই করা হয়নি, বা সম্ভবত "দু" নামের আইটেমটি আগে সরিয়ে দেওয়া হয়েছে? তার মানে প্রথমে আমাদের নিশ্চিত করা দরকার যে আমরা আসলে সঠিক কীটি জানি! এর জন্য আমরা findIndex()
পদ্ধতিটি ব্যবহার করতে পারি (যা যাইহোক, অ্যারে # ফাইন্ড ইন্ডেক্সের মতো প্রায় কাজ করে )।
একবার আমরা তালিকায় সূচিটি পেয়েছি যার মধ্যে আমরা আপডেট করতে চাই এমন আইটেমটি রয়েছে, আমরা যে মানটি আপডেট করতে চাই তার মূল পথটি সরবরাহ করতে পারি:
var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
এনবি: Set
বনামUpdate
মূল প্রশ্নটি সেট পদ্ধতির পরিবর্তে আপডেট পদ্ধতিগুলি উল্লেখ করে। আমি সেই ফাংশনটিতে দ্বিতীয় যুক্তিটি ব্যাখ্যা করব (ডাকা updater
), যেহেতু এটির থেকে আলাদা set()
। যদিও দ্বিতীয় আর্গুমেন্টটি set()
আমরা চাই নতুন মান, তবে দ্বিতীয় আর্গুমেন্টটি update()
এমন একটি ফাংশন যা পূর্ববর্তী মানটি গ্রহণ করে এবং আমরা চাইলে নতুন মানটি ফিরিয়ে দেয়। তারপরে, updateIn()
"ইন" বৈকল্পিকতা update()
যা কোনও মূল পথ গ্রহণ করে।
বলুন উদাহরণস্বরূপ আমরা আপনার উদাহরণ একটি প্রকরণ যে শুধু গণনা সেট না চেয়েছিলেন 4
, কিন্তু এর পরিবর্তে বৃদ্ধি বিদ্যমান গণনা, আমরা একটি ফাংশন যা বিদ্যমান মান এক যোগ প্রদান করতে পারে:
var index = list.findIndex(item => item.name === "three")
list = list.updateIn([index, "count"], value => value + 1)