Ich habe ein Objekt mit mehreren Eigenschaften. Ich möchte alle Eigenschaften entfernen, die falsche Werte enthalten.
Dies kann mit compact
auf Arrays erreicht werden, aber was ist mit Objekten?
Sie könnten ein eigenes Unterstrich-Plugin (Mixin) erstellen:
_.mixin({
compactObject: function(o) {
_.each(o, function(v, k) {
if(!v) {
delete o[k];
}
});
return o;
}
});
Und dann verwenden Sie es als native Unterstrichmethode:
var o = _.compactObject({
foo: 'bar',
a: 0,
b: false,
c: '',
d: null,
e: undefined
});
Wie @AndreiNeculaudarauf hingewiesen , wirkt sich dieses Mixin auf das ursprüngliche Objekt aus, während die ursprüngliche compact
-Unterstrichmethode eine Kopie des Arrays zurückgibt.
Um dieses Problem zu lösen und unsere compactObject
mehr zu verhalten, als wäre es cousin, hier ein kleines Update:
_.mixin({
compactObject : function(o) {
var clone = _.clone(o);
_.each(clone, function(v, k) {
if(!v) {
delete clone[k];
}
});
return clone;
}
});
Seit der Unterstreichungsversion 1.7.0 können Sie _.pick
verwenden:
_.pick(sourceObj, _.identity)
Der zweite Parameter für _.pick
kann eine Prädikatsfunktion zum Auswählen von Werten sein. Werte, für die das Prädikat wahrheitsgemäß zurückgibt, werden ausgewählt, und Werte, für die das Prädikat Falsy zurückgibt, werden ignoriert.
pick _.pick (Objekt, * Tasten)
Gibt eine Kopie von object zurück, die so gefiltert ist, dass sie nur Werte für die keys der Whitelist (oder ein Array gültiger Schlüssel) enthält. Akzeptiert alternativ ein Prädikat, das angibt, welche Schlüssel ausgewählt werden sollen.
_.identity
ist eine Hilfsfunktion, die ihr erstes Argument zurückgibt. Dies bedeutet, dass sie auch als Prädikatfunktion fungiert, die Wahrheitswerte auswählt und falsche Werte zurückweist. Die Underscore-Bibliothek enthält auch eine Reihe anderer Prädikate. Beispielsweise würde _.pick(sourceObj, _.isBoolean)
nur boolesche Eigenschaften beibehalten.
Wenn Sie diese Technik häufig verwenden, möchten Sie sie vielleicht etwas ausdrucksvoller machen:
var pickNonfalsy = _.partial(_.pick, _, _.identity); // Place this in a library module or something
pickNonfalsy(sourceObj);
In der Unterstreichung Version 1.6.0 wurde ebenfalls _.pick
bereitgestellt, jedoch wurde keine Prädikatsfunktion anstelle einer Whitelist akzeptiert.
_.omit( source, i => !i );
Dies wird umgekehrt zu Emil's Antwort gesagt. Auf diese Weise liest sich imho klarer; es ist selbsterklärend.
Etwas weniger sauber, wenn Sie nicht den Luxus von ES6 haben: _.omit( source, function(i){return !i;});
_.omit( source, _.isEmpty)
Wenn Sie_.isEmpty
anstelle von _.identity
für Wahrhaftigkeit verwenden, /, werden auch leere Arrays und Objekte aus der Sammlung entfernt und möglicherweise Zahlen und Datumsangaben unzweckmäßig entfernt . Daher ist das Ergebnis NICHT eine exakte Antwort auf die Frage des OP. Es kann jedoch nützlich sein, wenn leere Sammlungen entfernt werden sollen.
Mit lodash's transform ,
_.transform(obj, function(res, v, k) {
if (v) res[k] = v;
});
Object.keys(o).forEach(function(k) {
if (!o[k]) {
delete o[k];
}
});
Sie können einen flachen Klon erstellen:
_(obj).reduce(function(a,v,k){
if(v){ a[k]=v; }
return a;
},{});
für Objekt verwenden löschen.
for(var k in obj){
if(obj.hasOwnProperty(k) && !obj[k]){
delete obj[k];
}
}
Plötzlich musste ich eine Funktion erstellen, um rekursive Fehler zu entfernen. Ich hoffe das hilft. Ich benutze Lodash.
var removeFalsies = function (obj) {
return _.transform(obj, function (o, v, k) {
if (v && typeof v === 'object') {
o[k] = _.removeFalsies(v);
} else if (v) {
o[k] = v;
}
});
};
_.mixin({ 'removeFalsies': removeFalsies });
Dann kannst du es benutzen:
var o = _.removeFalsies({
foo: 'bar',
a: 0,
b: false,
c: '',
d: null,
e: undefined,
obj: {
foo: 'bar',
a: 0,
b: false,
c: '',
d: null,
e: undefined
}
});
// {
// foo: 'bar',
// obj: {
// foo: 'bar'
// }
// }
So fügen Sie gion_13s Antwort hinzu:
_.mixin({
compactObject : function(o) {
var newObject = {};
_.each(o, function(v, k) {
if(v !== null && v !== undefined) {
newObject[k] = v
}
});
return newObject;
}
});
Dieser erstellt ein neues Objekt und fügt Schlüssel und Werte hinzu, anstatt alles zu klonen und Schlüssel-Wert-Paare zu löschen. Kleiner Unterschied.
Wichtiger ist jedoch, dass explizit nach null und undefined anstelle von falsey gesucht wird, wodurch Schlüssel-Wert-Paare gelöscht werden, die den Wert false haben.
im lodash gefällt dir das:
_.pickBy(object, _.identity);