map
বস্তুর তালিকা থেকে 'কলামগুলি' নির্বাচন করার উপযুক্ত সমাধান হলেও এটির একটি খারাপ দিক রয়েছে। কলামগুলি বিদ্যমান কিনা তা স্পষ্টভাবে যাচাই না করা হলে এটি একটি ত্রুটি ফেলে দেবে এবং (সর্বোপরি) আপনাকে সরবরাহ করবে undefined
। আমি এমন একটি reduce
সমাধান বেছে নেব , যা কেবল সম্পত্তিটিকে অগ্রাহ্য করতে পারে বা আপনাকে ডিফল্ট মান দিয়ে সেট আপ করতে পারে।
function getFields(list, field) {
// reduce the provided list to an array only containing the requested field
return list.reduce(function(carry, item) {
// check if the item is actually an object and does contain the field
if (typeof item === 'object' && field in item) {
carry.push(item[field]);
}
// return the 'carry' (which is the list of matched field values)
return carry;
}, []);
}
jsbin উদাহরণ
প্রদত্ত তালিকার আইটেমগুলির মধ্যে একটিতে অবজেক্ট না থাকলে বা ক্ষেত্রটি না থাকলেও এটি কাজ করবে।
এমনকি কোনও আইটেমটি অবজেক্ট না হওয়া এবং ক্ষেত্রটি না থাকাতে এটি একটি ডিফল্ট মান নিয়ে আলোচনা করে আরও নমনীয় করে তোলা যায়।
function getFields(list, field, otherwise) {
// reduce the provided list to an array containing either the requested field or the alternative value
return list.reduce(function(carry, item) {
// If item is an object and contains the field, add its value and the value of otherwise if not
carry.push(typeof item === 'object' && field in item ? item[field] : otherwise);
// return the 'carry' (which is the list of matched field values)
return carry;
}, []);
}
jsbin উদাহরণ
এটি মানচিত্রের সাথে একই হবে কারণ প্রত্যাবর্তিত অ্যারের দৈর্ঘ্য প্রদত্ত অ্যারের সমান হবে। ( map
এক্ষেত্রে ক এর চেয়ে সামান্য সস্তা reduce
):
function getFields(list, field, otherwise) {
// map the provided list to an array containing either the requested field or the alternative value
return list.map(function(item) {
// If item is an object and contains the field, add its value and the value of otherwise if not
return typeof item === 'object' && field in item ? item[field] : otherwise;
}, []);
}
jsbin উদাহরণ
এবং তারপরে সর্বাধিক নমনীয় সমাধান রয়েছে, যা আপনাকে বিকল্প বিকল্প প্রদানের মাধ্যমে উভয় আচরণের মধ্যে স্যুইচ করতে দেয়।
function getFields(list, field, otherwise) {
// determine once whether or not to use the 'otherwise'
var alt = typeof otherwise !== 'undefined';
// reduce the provided list to an array only containing the requested field
return list.reduce(function(carry, item) {
// If item is an object and contains the field, add its value and the value of 'otherwise' if it was provided
if (typeof item === 'object' && field in item) {
carry.push(item[field]);
}
else if (alt) {
carry.push(otherwise);
}
// return the 'carry' (which is the list of matched field values)
return carry;
}, []);
}
jsbin উদাহরণ
উপরের উদাহরণগুলি (আশা করি) এটি যেভাবে কাজ করে তাতে কিছুটা আলোকপাত করেছে, ফাংশনটি ব্যবহার করে Array.concat
ফাংশনটি কিছুটা ছোট করতে দিন ।
function getFields(list, field, otherwise) {
var alt = typeof otherwise !== 'undefined';
return list.reduce(function(carry, item) {
return carry.concat(typeof item === 'object' && field in item ? item[field] : (alt ? otherwise : []));
}, []);
}
jsbin উদাহরণ
var foos = objArray.pluck("foo");
।