අතර 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 උදාහරණය
මෙය සිතියම සමඟ සමාන වේ, ආපසු ලබා දුන් අරාවෙහි දිග සපයා ඇති අරාවට සමාන වේ. (ඒ අවස්ථාවේ දී a ට 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");
.