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과 동일합니다. (이 경우 a map
가 a보다 약간 저렴합니다 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");
.