Mặc dù map
là một giải pháp thích hợp để chọn 'cột' từ danh sách các đối tượng, nhưng nó có một nhược điểm. Nếu không được kiểm tra rõ ràng liệu các cột có tồn tại hay không, nó sẽ đưa ra lỗi và (tốt nhất) cung cấp cho bạn undefined
. Tôi muốn chọn reduce
giải pháp, có thể chỉ cần bỏ qua thuộc tính hoặc thậm chí thiết lập cho bạn một giá trị mặc định.
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;
}, []);
}
ví dụ jsbin
Điều này sẽ hoạt động ngay cả khi một trong các mục trong danh sách được cung cấp không phải là một đối tượng hoặc không chứa trường.
Nó thậm chí có thể được thực hiện linh hoạt hơn bằng cách đàm phán một giá trị mặc định nếu một mục không phải là một đối tượng hoặc không chứa trường.
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;
}, []);
}
ví dụ jsbin
Điều này sẽ giống với bản đồ, vì độ dài của mảng được trả về sẽ giống với mảng được cung cấp. (Trong trường hợp a map
rẻ hơn một chút 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;
}, []);
}
ví dụ jsbin
Và sau đó là giải pháp linh hoạt nhất, một giải pháp cho phép bạn chuyển đổi giữa cả hai hành vi chỉ bằng cách cung cấp một giá trị thay thế.
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;
}, []);
}
ví dụ jsbin
Như các ví dụ ở trên (hy vọng) làm sáng tỏ cách thức hoạt động của nó, hãy rút ngắn chức năng một chút bằng cách sử dụng Array.concat
chức năng.
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 : []));
}, []);
}
ví dụ jsbin
var foos = objArray.pluck("foo");
.