Ich habe ein Objekt mit mehreren Eigenschaften. Ich möchte alle Eigenschaften entfernen, die falsche Werte haben.
Dies kann mit compact
Arrays erreicht werden, aber was ist mit Objekten?
Ich habe ein Objekt mit mehreren Eigenschaften. Ich möchte alle Eigenschaften entfernen, die falsche Werte haben.
Dies kann mit compact
Arrays erreicht werden, aber was ist mit Objekten?
Antworten:
Sie können Ihr eigenes Unterstrich-Plugin (Mixin) erstellen:
Und dann verwenden Sie es als native Unterstrichmethode:
Aktualisieren
Wie @AndreiNeculau wies darauf hin , wirkt sich dies mixin das ursprüngliche Objekt, während die ursprüngliche
compact
Strich Methode eine Kopie des Arrays zurückgibt .Um dieses Problem zu lösen und unser
compactObject
Verhalten mehr wie ein Cousin zu verhalten , gibt es hier ein kleines Update:quelle
_.compact
. Es werden Eigenschaften gelöscht, anstatt einen flachen Klon mit nur wahrheitsgemäßen Werten zu erstellen. Siehe stackoverflow.com/a/19750822/465684 untendelete
wird generell von der Verwendung abgeraten, da dadurch gleichnamige Eigenschaften aus der Prototypenkette sofort verfügbar gemacht werden und die Leistung aufgrund von "versteckten Klassen" (V8) beeinträchtigt wird. Durch Ändern der Objektstruktur führt die Engine zusätzliche Arbeit aus. Die beste und kürzeste Lösung wäre_.pick(o, _.identity)
.Seit Underscore Version 1.7.0 können Sie Folgendes verwenden
_.pick
:Erläuterung
Der zweite Parameter
_.pick
kann eine Prädikatfunktion zum Auswählen von Werten sein. Werte, für die das Prädikat die Wahrheit zurückgibt, werden ausgewählt, und Werte, für die das Prädikat die Wahrheit zurückgibt, werden ignoriert._.identity
ist eine Hilfsfunktion, die ihr erstes Argument zurückgibt. Dies bedeutet, dass sie auch als Prädikatfunktion fungiert, die wahrheitsgemäße Werte auswählt und falschwertige Werte ablehnt. Die Unterstreichungsbibliothek enthält auch eine Reihe anderer Prädikate, die beispielsweise_.pick(sourceObj, _.isBoolean)
nur boolesche Eigenschaften beibehalten würden.Wenn Sie diese Technik häufig anwenden, möchten Sie sie möglicherweise etwas ausdrucksvoller gestalten:
Unterstrich Version 1.6.0 wurde ebenfalls bereitgestellt
_.pick
, akzeptierte jedoch keine Prädikatfunktion anstelle einer Whitelist.quelle
_.identity
Funktion, sehr praktisch._.omit(sourceObj, _.isUndefined)
, nur undefinierte Werte zu entfernen (false, null, 0 zulassen).pick(obj, Boolean)
Falsey-Werte zu eliminieren. Dieselbe Vorgehensweise kann verwendet werden, wennarr.filter(Boolean)
ein Array von Falsey-Werten gereinigt wird ..._.pick(sourceObj, prop => prop)
_.pick
arbeitet mit Eigenschaftsnamen, für diese Funktionalität wie in der_.pickBy
Schnell und klar:
_.omitBy( source, i => !i );
Dies wird in umgekehrter Weise zu Emils Antwort gesagt. Auf diese Weise liest imho klarer; es ist selbsterklärender.
Etwas weniger sauber, wenn Sie nicht den Luxus von ES6 haben:
_.omitBy( source, function(i){return !i;});
Wechseln:
_.omitBy( source, _.isEmpty)
Wenn Sie
_.isEmpty
anstelle von_.identity
Wahrhaftigkeit verwenden, werden auch leere Arrays und Objekte bequem aus der Sammlung entfernt und möglicherweise ungünstig Zahlen und Daten entfernt . Daher ist das Ergebnis KEINE genaue Antwort auf die Frage des OP. Es kann jedoch hilfreich sein, wenn leere Sammlungen entfernt werden sollen.quelle
omitBy
. lodash.com/docs#omitBy_.pick(source, i => i);
was die Negation vermeidet_.pickBy(source)
ist alles was benötigt wird.Mit lodashs Verwandlung ,
quelle
var compactObject = _.partialRight(_.pick, _.identity);
_.pickBy
statt sein_.pick
)_.pickBy(object)
ist alles was Sie brauchenquelle
.keys
und verwenden.forEach
.forEach
Methode von JSSie können einen flachen Klon erstellen:
quelle
für Objektgebrauch löschen.
quelle
Plötzlich musste ich eine Funktion erstellen, um rekursiv Fälschungen zu entfernen. Ich hoffe das hilft. Ich benutze Lodash.
Dann können Sie es verwenden:
quelle
So ergänzen Sie die Antwort von gion_13:
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.
Noch wichtiger ist jedoch, dass explizit nach null und undefiniert anstelle von falsey gesucht wird, wodurch Schlüssel-Wert-Paare gelöscht werden, deren Wert false ist.
quelle
in der lodash gefällt dir das:
quelle
Obwohl
_.compact
für die Verwendung in Arrays dokumentiert ist. Es scheint auch für Objekte zu funktionieren. Ich habe gerade Folgendes in Chrome-, Opern- und Firefox-Konsolen ausgeführt:UPDATE: Wie aus dem Beispiel hervorgeht, werden beim Aufrufen
_.compact
eines Objekts die Schlüssel gelöscht und ein komprimiertes Array zurückgegeben.quelle