Wie rekursiv undefiniert Eigenschaften aus einem Objekt zu löschen - unter Beibehaltung der Konstruktor-Kette?

8

Dies ist eine Frage ähnlich wie Wie unbestimmte und Null-Werte von einem Objekt mit lodash entfernen? . Die dort vorgeschlagenen Lösungen bewahren jedoch den Konstruktor nicht. Außerdem möchte ich nur die Schlüssel löschen, die beginnen, sagen wir mit '_'.

Hier ist, was ich suche, und es scheint nicht zu schaffen, von lodash zu kommen:

Eingabe: new Cons({key1 : 'value1', key2 : {key21 : 'value21', _key22: undefined}, key3: undefined, _key4 : undefined})

Ausgabe: {key1 : 'value1', key2 : {key21 : 'value21'}, key3: undefined}

wo zum Beispiel function Cons(obj){_.extend(this, obj)}

Ich habe eine Lösung mit omitBy unter Verwendung von lodash, aber ich verliere die Konstruktorinformation (d. h. ich kann instanceof Cons nicht mehr verwenden, um den Objektkonstruktor zu unterscheiden). forIn sah wie ein guter Kandidat für das rekursive Traversal aus, aber es liefert mir nur die value und die key . Ich brauche auch den Pfad, um das Objekt zu löschen (mit unset ).

Bitte beachten Sie:

  • Das Objekt ist jedes gültige JavaScript-Objekt
  • Der Konstruktor ist ein beliebiger JavaScript-gültiger Konstruktor, und das Objekt wird mit dem bereits festgelegten Konstruktor geliefert.
  • Das resultierende Objekt muss instanceof whatevertheconstructorwas immer noch wahr
  • haben

Gibt es eine bessere Lösung (mit lodash oder anderen)?

    
user3743222 16.05.2016, 04:35
quelle

4 Antworten

6

Sie können eine Funktion erstellen, die Schlüssel mithilfe von omitBy () und mapValues ​​() als unterstützende Funktion zum rekursiven Versetzen von Schlüsseln.

Beispiel:

%Vor% %Vor%

Aktualisieren

Sie können das Objekt selbst mutieren, indem Sie eine Funktion erstellen, die das Objekt rekursiv mit each () durchläuft und die Entfernung um unset () .

%Vor% %Vor%
    
ryeballar 16.05.2016, 09:03
quelle
1

Sie können das rundef -Paket verwenden.

Standardmäßig werden alle Eigenschaften der obersten Ebene durch Werte ersetzt, die auf undefined gesetzt sind. Es unterstützt jedoch die folgenden Optionen:

  • mutate - setze dies auf false , um das gleiche Objekt zurückzugeben, das du angegeben hast; Dadurch wird sichergestellt, dass der Konstruktor nicht geändert wird
  • recursive - setze dies auf true , um dein Objekt rekursiv zu bearbeiten

Daher können Sie für Ihren Anwendungsfall Folgendes ausführen:

%Vor%     
d4nyll 14.02.2018 16:03
quelle
0

Sie können JSON.stringify() , JSON.parse() , RegExp.prototype.test()

verwenden %Vor%

%Vor% %Vor%
    
guest271314 16.05.2016 05:03
quelle
0
  

Haftungsausschluss: Ich habe keine Ahnung, was lodash als eingebaute Funktionen unterstützt, aber das ist sehr einfach mit Vanille Javascript zu implementieren.

Beginnen Sie mit einer generischen Funktion zum Filtern der Schlüssel Ihres Objekts

%Vor%

Dann eine Funktion, die basierend auf Ihrem spezifischen Verhalten filtert

%Vor%

Dann rufe es auf ein Objekt

%Vor%

Dies kann jetzt einfach in Ihren Konstruktor integriert werden

%Vor%

BEARBEITEN:

Beim zweiten Gedanken, anstatt eine vollkommen gute Funktion mit impliziter tiefer Rekursion abzuschlachten, könnten Sie die generischen Operationen abstrahieren und eine spezifische "tiefe" Filterfunktion definieren %Vor%

Die Integration in Ihren Konstruktor bleibt gleich

%Vor%     
user633183 16.05.2016 05:17
quelle

Tags und Links