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:
_.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 @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:
_.mixin({
compactObject : function(o) {
var clone = _.clone(o);
_.each(clone, function(v, k) {
if(!v) {
delete clone[k];
}
});
return clone;
}
});
_.compact
. Es werden Eigenschaften gelöscht, anstatt einen flachen Klon mit nur wahrheitsgemäßen Werten zu erstellen. Siehe stackoverflow.com/a/19750822/465684 unten
delete
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
:
_.pick(sourceObj, _.identity)
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.
wähle _.pick (Objekt, * Schlüssel)
Geben Sie eine Kopie des Objekts zurück , die so gefiltert ist, dass sie nur Werte für die Whitelist- Schlüssel (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 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:
var pickNonfalsy = _.partial(_.pick, _, _.identity); // Place this in a library module or something
pickNonfalsy(sourceObj);
Unterstrich Version 1.6.0 wurde ebenfalls bereitgestellt _.pick
, akzeptierte jedoch keine Prädikatfunktion anstelle einer Whitelist.
_.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, wenn arr.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
_.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;});
_.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.
omitBy
. lodash.com/docs#omitBy
_.pick(source, i => i);
was die Negation vermeidet
_.pickBy(source)
ist alles was benötigt wird.
Mit lodashs Verwandlung ,
_.transform(obj, function(res, v, k) {
if (v) res[k] = v;
});
var compactObject = _.partialRight(_.pick, _.identity);
_.pickBy(object)
ist alles was Sie brauchen
Object.keys(o).forEach(function(k) {
if (!o[k]) {
delete o[k];
}
});
.keys
und verwenden .forEach
.
forEach
Methode von JS
für Objektgebrauch löschen.
for(var k in obj){
if(obj.hasOwnProperty(k) && !obj[k]){
delete obj[k];
}
}
Plötzlich musste ich eine Funktion erstellen, um rekursiv Fälschungen 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 können Sie es verwenden:
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 ergänzen Sie die Antwort von gion_13:
_.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.
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.
in der lodash gefällt dir das:
_.pickBy(object, _.identity);
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:
var obj = {first: 1, second: null, third: 3, fourth: function(){return 5}}
undefined
_.compact(obj)
[1, 3, function()]
UPDATE: Wie aus dem Beispiel hervorgeht, werden beim Aufrufen _.compact
eines Objekts die Schlüssel gelöscht und ein komprimiertes Array zurückgegeben.