Wie entferne ich alle Attribute, die sind undefined
oder null
in einem JavaScript - Objekt?
(Frage ist ähnlich wie diese für Arrays)
javascript
abhijit
quelle
quelle
Antworten:
Sie können das Objekt durchlaufen:
Wenn Sie befürchten, dass durch das Entfernen dieser Eigenschaft die Proptypkette des Objekts nicht ausgeführt wird, können Sie außerdem:
Ein paar Anmerkungen zu null vs undefined:
quelle
Verwendung von ES6 / ES2015 :
1) Ein einfacher Einzeiler zum Entfernen der Elemente inline ohne Zuordnung:
jsbin
2) Dieses Beispiel wurde entfernt ...
3) Erstes Beispiel als Funktion geschrieben:
jsbin
4) Diese Funktion verwendet die Rekursion , um Elemente auch aus verschachtelten Objekten zu löschen:
jsbin
4b) Dies ist ähnlich wie 4), aber anstatt das Quellobjekt direkt zu mutieren, wird ein neues Objekt zurückgegeben.
5) Ein funktionaler Ansatz zu 4b) basierend auf der Antwort von @ MichaelJ.Zoidl unter Verwendung von
filter()
undreduce()
. Dieser gibt auch ein neues Objekt zurück:jsbin
6) Wie 4), jedoch mit ES7 / 2016
Object.entries()
.5b) Eine andere Funktionsversion , die Rekursion verwendet und mit ES2019 ein neues Objekt zurückgibt
Object.fromEntries()
:7) Wie 4), jedoch in einfachem ES5 :
jsbin
quelle
keys
aus einem entferntobject
, alsoo
undk
offensichtlich ist. Aber ich denke, es ist Geschmackssache.Object.keys(myObj).forEach(function (key) {(myObj[key] == null) && delete myObj[key]});
Object.entries(myObj).reduce((acc, [key, val]) => { if (val) acc[key] = val; return acc; }, {})
Wenn Sie lodash oder underscore.js verwenden, ist hier eine einfache Lösung:
Dies funktioniert nur mit lodash 4, pre lodash 4 oder underscore.js
_.pick(obj, _.identity)
.quelle
_.omit(obj, _.isUndefined)
ist es besser._.isUndefined
lässt keine Nullen aus, verwendet_.omitBy(obj, _.isNil)
beideundefined
undnull
Kürzeste Einzeiler für ES6 +
Filter alle falsy Werte (
""
,0
,false
,null
,undefined
)Filter
null
undundefined
Werte:NUR filtern
null
NUR filtern
undefined
Rekursive Lösungen: Filter
null
undundefined
Für Objekte:
Für Objekte und Arrays:
quelle
v == null
, werden Sie gegenundefined
und prüfennull
.cleanEmpty
rekursiven Lösungen geben ein leeres Objekt{}
für Datumsobjekte zurückWenn jemand eine rekursive Version von Owens (und Erics) Antwort benötigt, ist dies hier:
quelle
hasOwnProperty
mitif(test.hasOwnProperty(i)) { ... }
JSON.stringify entfernt die undefinierten Schlüssel.
quelle
null
alsundefined
Ersatzfunktion behandelt werden müssen , finden Sie weitere Informationen in dieser Antwort: stackoverflow.com/questions/286141/…null
Werte entfernt werden. Versuchen Sie:let a = { b: 1, c: 0, d: false, e: null, f: undefined, g: [], h: {} }
und dannconsole.log(removeUndefined(a))
. Frage war überundefined
undnull
Werte.Sie suchen wahrscheinlich nach dem
delete
Schlüsselwort.quelle
Einfachste mögliche Lodash Lösung ein Objekt mit dem zurück
null
undundefined
Wert herausgefiltert._.omitBy(obj, _.isNil)
quelle
Sie können eine Kombination aus
JSON.stringify
dem Ersetzungsparameter verwenden undJSON.parse
ihn wieder in ein Objekt verwandeln. Die Verwendung dieser Methode bedeutet auch, dass alle verschachtelten Schlüssel in verschachtelten Objekten ersetzt werden.Beispielobjekt
Ersatzfunktion
Reinigen Sie das Objekt
CodePen-Beispiel
quelle
Mit Ramda # pickBy werden Sie alle entfernen
null
,undefined
undfalse
Werte:Wie @manroe betonte, verwenden Sie, um
false
Werte zu verwendenisNil()
:quelle
(v) => !R.isNil(v)
ist wahrscheinlich eine bessere Wahl für die Frage von OP, dafalse
oder andere falsche Werte auch vonR.identity
Funktionaler und unveränderlicher Ansatz, ohne
.filter
und ohne mehr Objekte als nötig zu erstellenquelle
obj[key] === undefined
aufobj[key] === undefined || obj[key] === null
const omitFalsy = obj => Object.keys(obj).reduce((acc, key) => ({ ...acc, ...(obj[key] && { [key]: obj[key] }) }), {});
Sie können eine rekursive Entfernung in einer Zeile mit durchführen Ersetzerargument von json.stringify durchführen
Verwendung:
Wie in Emmanuels Kommentar erwähnt, funktionierte diese Technik nur, wenn Ihre Datenstruktur nur Datentypen enthält, die in das JSON-Format (Zeichenfolgen, Zahlen, Listen usw.) gestellt werden können.
(Diese Antwort wurde die neuen zu verwenden , aktualisiert Nullish Coalescing Betreiber je nach Browser Support - Anforderungen können Sie diese Funktion nutzen , statt.
(k,v) => v!=null ? v : undefined
)quelle
NaN
innull
die nicht konvertiert wird .Sie können mit
!
Bedingung kürzer machenDenken Sie bei der Verwendung daran: wie @semicolor in Kommentaren ankündigt: Dies würde auch Eigenschaften löschen, wenn der Wert eine leere Zeichenfolge, false oder null ist
quelle
[null, undefined].includes(r[k])
anstelle von!r[k]
.Kürzere reine ES6-Lösung, konvertieren Sie sie in ein Array, verwenden Sie die Filterfunktion und konvertieren Sie sie zurück in ein Objekt. Wäre auch einfach eine Funktion zu machen ...
Übrigens. Damit
.length > 0
überprüfe ich, ob es einen leeren String / Array gibt, damit leere Schlüssel entfernt werden.JS BIN https://jsbin.com/kugoyinora/edit?js,console
quelle
null
undundefined
es wäre einfacher, nur zu verwendenMY_OBJECT[f] != null
. Ihre aktuelle Lösung entfernt alles außer nicht leeren Zeichenfolgen / Listen undnull
filter
, wäre besser lesbar.omit
macht, müssen Sie überprüfen, ob obj existiert, bevor Sie anrufenObject.keys
:const omit = (obj, filter) => obj && Object.keys(obj).filter(key => !filter(obj[key])).reduce((acc,key) => {acc[key] = obj[key]; return acc}, {});
Wenn Sie 4 Zeilen einer reinen ES7-Lösung wünschen:
Oder wenn Sie eine besser lesbare Version bevorzugen:
Dadurch bleiben boolesche Werte erhalten und Arrays werden bereinigt. Das Originalobjekt bleibt auch erhalten, indem eine bereinigte Kopie zurückgegeben wird.
quelle
Ich habe das gleiche Szenario in meinem Projekt und habe es mit der folgenden Methode erreicht.
Es funktioniert mit allen Datentypen, nur wenige der oben genannten funktionieren nicht mit Datums- und leeren Arrays.
removeEmptyKeysFromObject.js
Übergeben Sie ein beliebiges Objekt an diese Funktion. removeEmptyKeysFromObject ()
quelle
Für eine gründliche Suche habe ich den folgenden Code verwendet. Vielleicht ist er für alle nützlich, die sich mit dieser Frage befassen (er kann nicht für zyklische Abhängigkeiten verwendet werden):
quelle
Wenn Sie nicht an Ort und Stelle mutieren möchten, sondern einen Klon mit entferntem null / undefined zurückgeben möchten, können Sie die ES6-Reduktionsfunktion verwenden.
quelle
Anstatt die Eigenschaft zu löschen, können Sie auch ein neues Objekt mit den Schlüsseln erstellen, die nicht null sind.
quelle
Um Bens Antwort auf die Lösung dieses Problems mit lodash's zu überprüfen
_.pickBy
, können Sie dieses Problem auch in der Schwesterbibliothek lösen: Underscore.js 's_.pick
.Siehe: JSFiddle-Beispiel
quelle
Ein Reduzierungshelfer kann den Trick machen (ohne Typprüfung) -
quelle
Wenn jemand
undefined
Werte aus einem Objekt mit Deep Search mit entfernen muss,lodash
dann ist hier der Code, den ich verwende. Es ist ganz einfach, es zu ändern, um alle leeren Werte (null
/undefined
) zu entfernen .quelle
Mit Lodash:
quelle
Wenn Sie eslint verwenden und vermeiden möchten, dass die No-Param-Reignign-Regel ausgelöst wird, können Sie Object.assign in Verbindung mit .reduce und einem berechneten Eigenschaftsnamen für eine recht elegante ES6-Lösung verwenden:
quelle
Hier ist eine funktionale Möglichkeit,
nulls
mit ES6 aus einem Objekt zu entfernen , ohne das Objekt nur mit zu mutierenreduce
:quelle
stripNulls
Funktion wird eine Referenz von außerhalb des Bereichs der Akkumulatorfunktion verwendet. und es mischt auch die Bedenken durch Filtern innerhalb der Akkumulatorfunktion. 😝 (zBObject.entries(o).filter(([k,v]) => v !== null).reduce((o, [k, v]) => {o[k] = v; return o;}, {});
) Ja, die gefilterten Elemente werden zweimalSie können die
...
Spread-Syntax auch folgendermaßen verwendenforEach
:quelle
Reinigen Sie das Objekt an Ort und Stelle
Reine Funktion
quelle
Wir können JSON.stringify und JSON.parse verwenden, um leere Attribute aus einem Objekt zu entfernen.
quelle
{} != {}
und[] != []
), aber ansonsten ist der Ansatz gültigHier ist eine umfassende rekursive Funktion (ursprünglich basierend auf der von @chickens), die:
defaults=[undefined, null, '', NaN]
VERWENDUNG:
quelle
Wenn Sie den reinen / funktionalen Ansatz bevorzugen
quelle