ES6 ধ্বংসাত্মক
সিনট্যাক্স তৈরির ফলে ফাংশন প্যারামিটার বা ভেরিয়েবলের সাহায্যে কোনও অবয়বকে পুনঃনির্মাণ এবং পুনঃসংযোগের অনুমতি দেয়।
সীমাবদ্ধতাটি হ'ল কীগুলির একটি তালিকা পূর্বনির্ধারিত, সেগুলিকে স্ট্রিং হিসাবে তালিকাভুক্ত করা যাবে না, যেমন প্রশ্নের উল্লেখ রয়েছে। কোনও কী-অক্ষরবিহীন, উদাহরণস্বরূপ, নির্মাণ আরও জটিল হয়ে ওঠে foo_bar।
খারাপ দিকটি হ'ল এর জন্য কীগুলির একটি তালিকা নকল করা দরকার, একটি তালিকা দীর্ঘ হওয়ার ক্ষেত্রে ভার্বোজ কোডের ফলস্বরূপ। যেহেতু ডুপ্লিকেটগুলি এই ক্ষেত্রে অবজেক্ট আক্ষরিক বাক্য গঠন করে, একটি তালিকা অনুলিপি করা যায় এবং সে হিসাবে এটি আটকানো যায়।
উল্টো দিকটি হল এটি পারফরম্যান্স সমাধান যা ES6 এর পক্ষে স্বাভাবিক।
IIFE
let subset = (({ foo, bar }) => ({ foo, bar }))(obj); // dupe ({ foo, bar })
অস্থায়ী পরিবর্তনশীল
let { foo, bar } = obj;
let subset = { foo, bar }; // dupe { foo, bar }
স্ট্রিংগুলির একটি তালিকা
বাছাই করা কীগুলির স্বেচ্ছাসেবী তালিকায় স্ট্রিং থাকে, যেমন প্রশ্ন প্রয়োজন। এটি তাদের পূর্বনির্ধারিত করতে এবং মূল নামগুলির মতো ভেরিয়েবলগুলি ব্যবহার করার অনুমতি দেয় likepick(obj, 'foo', someKey, ...moreKeys) ।
প্রতিটি জেএস সংস্করণের সাথে একটি ওয়ান-লাইনার সংক্ষিপ্ত হয়ে যায়।
ES5
var subset = Object.keys(obj)
.filter(function (key) {
return ['foo', 'bar'].indexOf(key) >= 0;
})
.reduce(function (obj2, key) {
obj2[key] = obj[key];
return obj2;
}, {});
ES6
let subset = Object.keys(obj)
.filter(key => ['foo', 'bar'].indexOf(key) >= 0)
.reduce((obj2, key) => Object.assign(obj2, { [key]: obj[key] }), {});
বা কমা অপারেটর সহ:
let subset = Object.keys(obj)
.filter(key => ['foo', 'bar'].indexOf(key) >= 0)
.reduce((obj2, key) => (obj2[key] = obj[key], obj2), {});
ES2019
ECMAScript 2017 এর রয়েছে Object.entriesএবং Array.prototype.includes, ECMAScript 2019 রয়েছে Object.fromEntries, তারা যখন প্রয়োজন হয় তখন পলিফিল করা যায় এবং কাজটি আরও সহজ করে তোলে:
let subset = Object.fromEntries(
Object.entries(obj)
.filter(([key]) => ['foo', 'bar'].includes(key))
)
লোড্যাশেরpick অনুরূপ সাহায্যকারী ফাংশন হিসাবে বা omitকীগুলির তালিকাটি আর্গুমেন্টগুলির মাধ্যমে পাস করা হয় সেখানে একটি ওয়ানলাইনার পুনরায় লেখা যেতে পারে :
let pick = (obj, ...keys) => Object.fromEntries(
Object.entries(obj)
.filter(([key]) => keys.includes(key))
);
let subset = pick({ foo: 1, qux: 2 }, 'foo', 'bar'); // { foo: 1 }
অনুপস্থিত কীগুলি সম্পর্কে একটি নোট
ডেস্ট্রাকচারিং এবং প্রচলিত লোড্যাশের মতো pickফাংশনের মধ্যে প্রধান পার্থক্য হ'ল ডেস্ট্রাকচারিংয়ে undefinedএকটি উপসেটের মান সহ অস্তিত্বহীন বাছাই করা কীগুলি অন্তর্ভুক্ত করা হয়:
(({ foo, bar }) => ({ foo, bar }))({ foo: 1 }) // { foo: 1, bar: undefined }
এই আচরণটি কাম্য হতে পারে বা নাও হতে পারে। সিনট্যাক্স বিনষ্ট করার জন্য এটি পরিবর্তন করা যায় না।
যদিও pickবাছাই করা কী-একটি তালিকা iterating পরিবর্তে দ্বারা অনুপস্থিত কী অন্তর্ভুক্ত করা পরিবর্তন করা যাবে:
let inclusivePick = (obj, ...keys) => Object.fromEntries(
keys.map(key => [key, obj[key]])
);
let subset = inclusivePick({ foo: 1, qux: 2 }, 'foo', 'bar'); // { foo: 1, bar: undefined }