Hier ist eine eigenständige Funktion abhängig von lodash/Unterstrich, die ich geschrieben habe, die das gleiche tut.
Sie ruft einen Callback für jedes Paar (value, indexOrKey) im Objekt oder Array auf und wenn true, wird dieses Paar im resultierenden Objekt ausgelassen.
Der Rückruf wird aufgerufen, nachdem der Wert aufgerufen wurde, sodass Sie eine ganze Unterstruktur mit Werten auslassen können, die Ihrer Bedingung entsprechen.
function deepOmit(sourceObj, callback, thisArg) {
var destObj, i, shouldOmit, newValue;
if (_.isUndefined(sourceObj)) {
return undefined;
}
callback = thisArg ? _.bind(callback, thisArg) : callback;
if (_.isPlainObject(sourceObj)) {
destObj = {};
_.forOwn(sourceObj, function(value, key) {
newValue = deepOmit(value, callback);
shouldOmit = callback(newValue, key);
if (!shouldOmit) {
destObj[key] = newValue;
}
});
} else if (_.isArray(sourceObj)) {
destObj = [];
for (i = 0; i <sourceObj.length; i++) {
newValue = deepOmit(sourceObj[i], callback);
shouldOmit = callback(newValue, i);
if (!shouldOmit) {
destObj.push(newValue);
}
}
} else {
return sourceObj;
}
return destObj;
}
Einige Proben
var sourceObj = {
a1: [ undefined, {}, { o: undefined } ],
a2: [ 1, undefined ],
o: { s: 's' }
};
deepOmit(sourceObj, function (value) {
return value === undefined;
});
//=> { a1: [ {}, {} ], a2: [ 1 ], o: { s: 's' }}
//omit empty objects and arrays too
deepOmit(sourceObj, function (value) {
return value === undefined ||
(_.isPlainObject(value) && !_.keys(value).length) ||
(_.isArray(value) && !value.length);
});
//=> { a2: [ 1 ], o: { s: 's' }}
//indexOrKey is the string key or the numeric index if the object is array
deepOmit([ 0, 1, 2, 3, 4 ], function (value, indexOrKey) {
return indexOrKey % 2;
});
//=> [ 0, 2, 4 ]
Es gibt keinen Weg '.extend' $ mit geklonten Mitgliedern, um herauszufiltern, aber Sie können Ihre eigene Implementierung rollen, die Felder auslässt ... –
würde ich erstellen Funktion, die ein zu klonendes Objekt und ein Array von Eigenschaften akzeptiert, die in Ihrem neuen Objekt entfernt (oder eingeschlossen) werden sollen. Es gibt keine integrierte Methode, um dies in jQuery zu tun. –
Underscore.js enthält die Funktion "pluck", die eine Art umgekehrte Version dessen ist, was Sie wollen: Geben Sie an, was Sie einschließen möchten und nicht, was Sie weglassen möchten. Vielleicht könnte das ein Ausgangspunkt für Ihre Implementierung sein? – Henrik