Ich habe ein Javascript-Objekt wie:
var my_object = { a:undefined, b:2, c:4, d:undefined };
Wie entferne ich alle undefinierten Eigenschaften? Falsche Attribute sollten bleiben.
javascript
object
lodash
JLavoie
quelle
quelle
_.pickBy(obj, _.identity);
false
Wert entfernenSie können einfach
_.omit()
mit_.isUndefined
und_.isNull
Kompositionen verketten und das Ergebnis mit einer verzögerten Bewertung erhalten.Demo
Update 14. März 2016 :
Wie von Dylants im Kommentarbereich erwähnt, sollten Sie die
_.omitBy()
Funktion verwenden, da sie ein Prädikat anstelle einer Eigenschaft verwendet. Sie sollten dies für die lodash-Version4.0.0
und höher verwenden.DEMO
Update 1. Juni 2016 :
Wie von Max Truxa kommentiert , bot lodash bereits eine Alternative
_.isNil
, die sowohl prüftnull
als auchundefined
:quelle
omitBy
Funktion anstelle von verwendenomit
. So_(my_object).omitBy(_.isUndefined).omitBy(_.isNull).value();
_.isNil
anstelle von Verkettung_.isUndefined
und verwenden_.isNull
. Dies macht es noch kürzer:var result = _.omitBy(my_object, _.isNil);
omitBy
ist weniger performant alspickBy
, daher sollte letzteres bevorzugt und die Bedingung in der Iteratee-Funktion umgekehrt werden. Die oben akzeptierte Antwort hat das richtig verstanden.null
undundefined
Werte. Dasidentity
Prädikat entfernt auchfalse
Werte. Wenn Sie es also einfach auf der Absicht der Frage basieren, sehe ich kein Problem mit meiner Antwort. Wenn es um "Leistung" geht, rufen Sie standardmäßigomitBy
einfachpickBy
mit einem negiertenidentity
Prädikat auf. In Bezug auf die Leistung ist es also zu klein, um signifikant zu sein.Wenn Sie lodash verwenden, können Sie
_.compact(array)
alle falschen Werte aus einem Array entfernen.https://lodash.com/docs/4.17.4#compact
quelle
_.pickBy(object, _.isNumber)
in diesem Fall verwenden.Die richtige Antwort ist:
Das ergibt:
Die hier von anderen Leuten gegebene Alternative:
Entfernt auch
false
Werte, die hier nicht erwünscht sind.quelle
{"a":1,"b":{"a":1,"b":null,"c":undefined}}
, object.b Eigenschaftb
, 'c' wird nicht entferntGerade:
Das Obige berücksichtigt keine
null
Werte, da sie im ursprünglichen Beispiel fehlen und nur im Betreff erwähnt werden, aber ich lasse es, da es elegant ist und möglicherweise seine Verwendung hat.Hier ist das vollständige Beispiel, weniger präzise, aber vollständiger.
quelle
_.omitBy
.Um die anderen Antworten zu vervollständigen, können Sie in lodash 4, um nur undefiniert und null (und nicht Eigenschaften wie
false
) zu ignorieren , ein Prädikat verwenden in_.pickBy
:_.pickBy(obj, v !== null && v !== undefined)
Beispiel unten:
quelle
0
,''
,false
Werte. Sie können den Rückruf auch auf verkürzenv => v != null
.Laut lodash docs:
Sie können auch alle Nullen herausfiltern
quelle
Für tief verschachtelte Objekte können Sie mein Snippet für lodash> 4 verwenden
quelle
Ich bin auf ein ähnliches Problem beim Entfernen
undefined
von einem Objekt (tiefgreifend) gestoßen und habe festgestellt, dass eine schnelle und schmutzige Hilfsfunktion folgendermaßen aussehen würde, wenn Sie Ihr einfaches altes Objekt konvertieren und JSON verwenden können:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Description
"... Wenn eine undefinierte Funktion oder ein Symbol während der Konvertierung angetroffen wird, wird es entweder weggelassen (wenn es in einem Objekt gefunden wird) oder auf null zensiert (wenn es in einem Array gefunden wird)."
quelle
mit reinem JavaScript: (obwohl Object.entries ES7 ist, ist Object.assign ES6; aber äquivalent ES5 verwendet nur Object.keys sollte auch machbar sein); Beachten Sie auch die
v != null
Überprüfungen auf null und undefiniert.Bearbeiten: Dies unten ist die Version nur mit ES5 Object.keys: aber im Allgemeinen mit ES7 in Node v8 ist ziemlich viel Spaß ;-)
Update im Oktober 2017 : Mit Node v8 (seit v8.3 oder so) hat es jetzt ein Objektverbreitungskonstrukt:
oder nur innerhalb einer reduzieren:
Update: will jemand rekursiv? ist auch nicht so schwer, brauche nur eine zusätzliche Überprüfung von isObject und rufe sich rekursiv auf:
Mein Fazit: Wenn reines Javascript dies kann, würde ich jegliche Bibliotheksabhängigkeiten von Drittanbietern vermeiden:
quelle
Da einige von Ihnen möglicherweise zu der Frage gekommen sind, nur gezielt zu entfernen
undefined
, können Sie Folgendes verwenden:eine Kombination von Lodash-Methoden
das
rundef
Paket, das nurundefined
Eigenschaften entferntWenn Sie Eigenschaften rekursiv entfernen müssen
undefined
, verfügt dasrundef
Paket auch über einerecursive
Option.Weitere Informationen finden Sie in der Dokumentation .
quelle
Hier ist der Lodash-Ansatz, den ich wählen würde:
Die Funktion pair () verwandelt das Eingabeobjekt in ein Array von Schlüssel / Wert-Arrays. Sie tun dies, damit es einfacher ist, Reject () zum Eliminieren
undefined
undnull
Werte zu verwenden. Danach bleiben Paare übrig, die nicht abgelehnt wurden, und diese werden für zipObject () eingegeben , das Ihr Objekt für Sie rekonstruiert.quelle
Unter Berücksichtigung, dass
undefined == null
wir wie folgt schreiben können:JSBin Beispiel
quelle
pickBy verwendet standardmäßig Identität :
quelle
Kürzester Weg (lodash v4):
quelle
Mit lodash (oder Unterstrich) können Sie tun
Andernfalls können Sie mit Vanille-JavaScript tun
Verwenden Sie keinen Falsey-Test, da nicht nur "undefined" oder "null" abgelehnt wird, sondern auch andere Falsey-Werte wie "false", "0", leere Zeichenfolge, {}. Um es einfach und verständlich zu machen, habe ich mich für den expliziten Vergleich entschieden, wie oben codiert.
quelle
Um alle Falsey- Werte wegzulassen , aber die booleschen Grundelemente beizubehalten , hilft diese Lösung.
quelle
quelle
Ich würde Unterstrich verwenden und mich auch um leere Zeichenfolgen kümmern:
jsbin .
quelle
Für tief verschachtelte Objekte und Arrays. und leere Werte von String und NaN ausschließen
Ergebnis:
quelle
Ich benutze gerne _.pickBy, weil Sie die volle Kontrolle darüber haben, was Sie entfernen:
Quelle: https://www.codegrepper.com/?search_term=lodash+remove+undefined+values+from+object
quelle
Für diejenigen unter Ihnen, die hierher kommen, um aus einer Reihe von Objekten zu entfernen und lodash zu verwenden, können Sie Folgendes tun:
Hinweis: Sie müssen nicht zerstören, wenn Sie nicht möchten.
quelle