2010-07-21 11 views
5

Also habe ich eine kurze Funktion schreiben, Mitglieder von einem Objekt zu entfernen, die falsy Werte haben:Entfernen falsies von JavaScript-Objekt

for (var key in object) { 
    if (!object[key]) { 
     delete object[key]; 
    } 
} 

Ein paar Tage später überprüfe ich die Quellcodeverwaltung und jemand hat sich geändert, dies zu:

var newObject = {}; 
for (var key in object) { 
    if (object[key]) { newObject[key] = object[key]; } 
} 
return newObject; 

Es gibt keine Kommentare zum Check-in und der Typ ist heute nicht hier bei der Arbeit.

Welche Implementierung ist besser? Welche Auswirkungen hat jede Methode auf die Leistung?

Antwort

3

Sie können eine Eigenschaft für ein Objekt, das sie von einem Prototyp erbt, nicht löschen. In einigen Fällen funktioniert der Code möglicherweise nicht wie erwartet.

Source

2

Sie können nicht delete eine Eigenschaft eines Objekts, dass es von einem prototype erbt (obwohl Sie es direkt auf dem Prototyp löschen können).

Im zweiten Beispiel wird eine von einer vererbte Falsy-Eigenschaft nicht in die newObject kopiert.

Weiterführende Literatur:

0

Ich denke, Ihr Code liest viel intuitiv. Vielleicht wollte er einfach nicht das ursprüngliche Objekt ändern?

+0

Nicht wahr, siehe Daniels und Yacoby der Antworten. –

+2

Diese Antworten und meine schließen sich nicht gegenseitig aus. Nun, zumindest können sie es nicht sein. Wir haben nicht genug Kontext, um eine Entscheidung zu treffen. –

1

Lo-Dash verwenden, sollten diese Implementierung (mit _.pick):

var newObject = _.pick(object, function onlyTruthy(val, key) { 
    return !!val; 
});