Ich habe ein Objekt. Ich möchte das Objekt ändern (nicht klonen), indem ich alle Eigenschaften mit Ausnahme bestimmter Eigenschaften lösche. Zum Beispiel, wenn ich mit diesem Objekt angefangen habe:
%Vor%und möchte nur die Eigenschaften p1, p2 und p100, wie kann ich dieses Objekt erhalten:
%Vor%Ich verstehe, wie ich das mit roher Gewalt tun könnte, aber ich möchte eine elegantere Lösung.
Sie könnten %code% :
verwenden %Vor%Eine Alternative zu %code% :
%Vor%Kürzere:
%Vor%Array zu RegExp:
%Vor%Nützlich mit einer Funktion:
%Vor%Verwendung:
%Vor%Sie mögen keine regulären Ausdrücke, möchten aber dennoch eine kugelsichere Lösung:
%Vor%Verwendung:
%Vor%Nun, ich könnte so unendlich weitermachen, aber es ist Zeit zu essen.
Initialisieren Sie das Objekt einfach neu:
%Vor%Eine andere Möglichkeit besteht darin, bestimmte Eigenschaften zu löschen, was weniger effektiv ist:
%Vor%Ich habe ein Objekt. Ich möchte das Objekt ändern (nicht klonen), indem ich alle Eigenschaften mit Ausnahme bestimmter Eigenschaften lösche. Zum Beispiel, wenn ich mit diesem Objekt angefangen habe:
%Vor%und möchte nur die Eigenschaften p1, p2 und p100, wie kann ich dieses Objekt erhalten:
%Vor%Ich verstehe, wie ich das mit roher Gewalt tun könnte, aber ich möchte eine elegantere Lösung.
Ein Objekt, das in einer Variablen namens %code% :
gespeichert ist %Vor%Eine neue Referenz auf dieses Objekt:
%Vor%%code% und %code% beziehen sich beide auf das gleiche Objekt:
%Vor%Aktualisieren wir das Objekt durch %code% :
%Vor%Aktualisieren wir das Objekt durch %code% :
%Vor%Wie Sie sehen können, sind %code% und %code% synchron.
Lass uns " %code% :" neu initialisieren:
%Vor%%code% und %code% beziehen sich jetzt auf verschiedene Objekte:
%Vor%Aktualisieren wir das in %code% gespeicherte Objekt:
%Vor%Aktualisieren wir das in %code% gespeicherte Objekt:
%Vor%Wie Sie sehen können, sind %code% und %code% nicht mehr synchron.
Die Frage ist: Wollen Sie beide Variablen ( %code% und %code% ) synchronisiert halten? Wenn ja, ist der zweite Codeblock der VisioN-Antwort der richtige. Andernfalls wählen Sie den ersten Codeblock.
>Dies war der erste Treffer beim googlen 'js nur bestimmte Schlüssel behalten', also könnte ein Update wert sein.
Die eleganteste Lösung ist möglicherweise die Verwendung von underscore.js
%Vor%Lodash hat eine Funktion namens %code% was das tut, was du beschreibst. Ich weiß, dass das Hinzufügen einer Bibliothek nicht ideal ist, aber Sie können auch Funktionen auswählen, wenn Sie Bundles usw. verwenden.
%Vor%Übergeben Sie eine Karte von Whitelist-Schlüsseln an einen IIFE (sofort aufgerufener Funktionsausdruck); nicht nur elegant, sondern auch flexibel IMO (vor allem, wenn man sich in eine Funktion bewegt, die nicht anders ist als in Juan Mendes 'Antwort)
%Vor%Ich nehme an, Sie könnten dem Prototyp eine neue Methode hinzufügen:
%Vor%Geige .
Sie könnten eine Ansicht auf Ihr erstes Objekt erstellen, eine Art Proxy, die nur die gewünschten Eigenschaften im Blick behält.
Die folgende Funktion erstellt beispielsweise eine Ansicht, die das Lesen und Schreiben des zugrunde liegenden Objekts ermöglicht, wobei nur die ausgewählten Eigenschaften beibehalten werden.
Sie können es sehr einfach lesen, indem Sie einfach den Setter entfernen.
Vielleicht möchten Sie auch das Proxy-Objekt versiegeln, damit ich keine spätere Änderung daran vornehmen kann.
Ein Anwendungsbeispiel wäre:
%Vor%Hier reflektiert objView die gewünschten Eigenschaften von myObj. Sie können sich die kleine jsbin anschauen, die ich hier gemacht habe:
Ergebnisse:
%Vor% beachte das:
1) Sie können ein Objekt durch seine Ansicht überschreiben und nur die gewünschten Eigenschaften beibehalten.
2) Sie können in einer versteckten Eigenschaft / in einer Schließung das ursprüngliche Objekt speichern, so dass Sie später die Eigenschaften ändern können, die Sie verfügbar machen.
Sie könnten delete
:
Eine Alternative zu indexOf
:
Kürzere:
%Vor%Array zu RegExp:
%Vor%Nützlich mit einer Funktion:
%Vor%Verwendung:
%Vor%Sie mögen keine regulären Ausdrücke, möchten aber dennoch eine kugelsichere Lösung:
%Vor%Verwendung:
%Vor%Nun, ich könnte so unendlich weitermachen, aber es ist Zeit zu essen.
Ein Objekt, das in einer Variablen namens o
:
Eine neue Referenz auf dieses Objekt:
%Vor% o
und p
beziehen sich beide auf das gleiche Objekt:
Aktualisieren wir das Objekt durch o
:
Aktualisieren wir das Objekt durch p
:
Wie Sie sehen können, sind o
und p
synchron.
Lass uns " o
:" neu initialisieren:
o
und p
beziehen sich jetzt auf verschiedene Objekte:
Aktualisieren wir das in o
gespeicherte Objekt:
Aktualisieren wir das in p
gespeicherte Objekt:
Wie Sie sehen können, sind o
und p
nicht mehr synchron.
Die Frage ist: Wollen Sie beide Variablen ( o
und p
) synchronisiert halten? Wenn ja, ist der zweite Codeblock der VisioN-Antwort der richtige. Andernfalls wählen Sie den ersten Codeblock.
Übergeben Sie eine Karte von Whitelist-Schlüsseln an einen IIFE (sofort aufgerufener Funktionsausdruck); nicht nur elegant, sondern auch flexibel IMO (vor allem, wenn man sich in eine Funktion bewegt, die nicht anders ist als in Juan Mendes 'Antwort)
%Vor% Sie könnten eine Ansicht auf Ihr erstes Objekt erstellen, eine Art Proxy, die nur die gewünschten Eigenschaften im Blick behält.
Die folgende Funktion erstellt beispielsweise eine Ansicht, die das Lesen und Schreiben des zugrunde liegenden Objekts ermöglicht, wobei nur die ausgewählten Eigenschaften beibehalten werden.
Sie können es sehr einfach lesen, indem Sie einfach den Setter entfernen.
Vielleicht möchten Sie auch das Proxy-Objekt versiegeln, damit ich keine spätere Änderung daran vornehmen kann.
Ein Anwendungsbeispiel wäre:
%Vor%Hier reflektiert objView die gewünschten Eigenschaften von myObj. Sie können sich die kleine jsbin anschauen, die ich hier gemacht habe:
Ergebnisse:
%Vor% beachte das:
1) Sie können ein Objekt durch seine Ansicht überschreiben und nur die gewünschten Eigenschaften beibehalten.
2) Sie können in einer versteckten Eigenschaft / in einer Schließung das ursprüngliche Objekt speichern, so dass Sie später die Eigenschaften ändern können, die Sie verfügbar machen.
Tags und Links javascript