Oto samodzielna funkcja w zależności od lodash/podkreślenia, że napisałem, że robi to samo.
Wywołuje wywołanie zwrotne dla każdej pary (value, indexOrKey) w obiekcie lub tablicy, a jeśli true, pominie tę parę w wynikowym obiekcie.
Oddzwonienie jest wywoływane po odwiedzeniu wartości, dzięki czemu można pominąć całe pod-drzewo wartości, które pasują do twojego stanu.
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;
}
Niektóre próbki
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 ]
Nie ma mowy, aby odfiltrować sklonowanych członków użyciem '$ .extend', ale można toczyć własną implementację, że są pomijane pola ... –
Chciałbym utworzyć funkcja, która akceptuje obiekt do sklonowania i tablicę właściwości, które mają zostać usunięte (lub dołączone) do nowego obiektu. W jQuery nie ma wbudowanej metody. –
Underscore.js zawiera funkcję 'pluck', która jest rodzajem odwrotnej wersji tego, co chcesz: Określ, co chcesz dołączyć, a nie to, co chcesz pominąć. Być może to może stanowić punkt wyjścia dla twojej implementacji? – Henrik