map
Nesneler listesinden 'sütunları' seçmek için uygun bir çözüm olsa da, bir dezavantajı vardır. Sütunların olup olmadığını açıkça kontrol etmezseniz, bir hata atar ve (en iyi ihtimalle) size sunar undefined
. Sadece reduce
özelliği görmezden gelebilir veya hatta varsayılan bir değerle ayarlayabileceğiniz bir çözüm seçerim.
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 örneği
Bu, sağlanan listedeki öğelerden biri bir nesne olmasa veya alanı içermese bile işe yarar.
Bir öğe nesne değilse veya alanı içermiyorsa, varsayılan bir değer üzerinde anlaşarak daha esnek hale getirilebilir.
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 örneği
Bu, döndürülen dizinin uzunluğu sağlanan diziyle aynı olacağından, harita ile aynı olacaktır. (Bu durumda a map
, a'dan biraz daha ucuzdur 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 örneği
Ve sonra en esnek çözüm, sadece alternatif bir değer sağlayarak her iki davranış arasında geçiş yapmanıza izin veren bir çözüm var.
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 örneği
Yukarıdaki örnekler (umarım) bunun işleyişine biraz ışık tuttuğundan, işlevi kullanarak Array.concat
işlevi biraz kısaltalım .
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 örneği
var foos = objArray.pluck("foo");
.