Dies map
ist zwar eine geeignete Lösung, um 'Spalten' aus einer Liste von Objekten auszuwählen, hat jedoch einen Nachteil. Wenn nicht explizit überprüft wird, ob die Spalten vorhanden sind oder nicht, wird ein Fehler ausgegeben und (bestenfalls) angezeigt undefined
. Ich würde mich für eine reduce
Lösung entscheiden, die die Eigenschaft einfach ignorieren oder Sie sogar mit einem Standardwert einrichten kann.
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 Beispiel
Dies würde auch dann funktionieren, wenn eines der Elemente in der bereitgestellten Liste kein Objekt ist oder das Feld nicht enthält.
Es kann sogar flexibler gestaltet werden, indem ein Standardwert ausgehandelt wird, falls ein Element kein Objekt ist oder das Feld nicht enthält.
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 Beispiel
Dies wäre bei map dasselbe, da die Länge des zurückgegebenen Arrays der Länge des bereitgestellten Arrays entsprechen würde. (In diesem Fall map
ist a etwas billiger als 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 Beispiel
Und dann gibt es die flexibelste Lösung, mit der Sie zwischen beiden Verhaltensweisen wechseln können, indem Sie einfach einen alternativen Wert angeben.
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 Beispiel
Da die obigen Beispiele (hoffentlich) etwas Licht in die Funktionsweise bringen, können Sie die Funktion durch Verwendung der Array.concat
Funktion etwas verkürzen .
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 Beispiel
var foos = objArray.pluck("foo");
.