Javascript: Überschreiben NUR vorhandene Felder in einem Objekt mit den Feldern, die in einem anderen
Gibt es eine Möglichkeit in javascript
Werte zuordnen von benannten Feldern in einem Objekt an der gleichen Felder zu einem Objekt, wenn und nur wenn das Ziel-Feld vorhanden ist. I. e. überschreibt alte Werte, NICHT das hinzufügen von neuen Werten, die Verwendung ideomatic Konstrukte, one-Linern (speziell für javascript und/oder jQuery) und in keiner Weise Schleifen, auch für-in.
var theSource = {
field1: "TEXT",
field2: "VAL",
field3: "ZZ",
field4: "4",
field5: "5"
},
theTarget = {
field2: "0",
field3: "",
field4: null,
field5: undefined
};
Etwas wie
var result = jQuery.overwriteOnlyExisting(theTarget, theSource);
result === {
field2: "VAL"
field3: "ZZ"
...
}
KEIN Feld1 UND alten Felder nach feld3 erhalten.
jQuery.extend
- Werte überschreiben kann, aber es kopiert die neuen Felder als gut.
Welche Möglichkeiten haben wir hier?
http://jsbin.com/owivat/1/edit (Unterstrich) - ich mag das, jetzt die Zeit zu finden, die jquery-Weg.
Ergebnisse:
_.extend(theTarget, _(theSource).pick(_(theTarget).keys()));
142,850 Ops/sec
Object.keys(theTarget).map(function(a) { if (a in theSource) theTarget[a] = theSource[a]; });
403,243 Ops/sec
- warum ...und in keiner Weise Schleifen, auch für-in ?
- Sie sollten underscorejs.org/#each und backbonejs.org/#Model-has für, die. Im Grunde ist es for-in-Schleife an der Quelle und Objekt.hasOwnProperty auf das Ziel.
- cool zu wissen, aber stecken mit jQuery 🙂
- mit nur standard-js, die wir tun können: Objekt.Schlüssel(Zeile target).map(function(a){ if(theSource[a]) die Zeile target[a]=theSource[a]})
- jquery ist nur für DOM-manipulation, so dass Sie nicht tun, dass mit jquery... btw es ist eine einfache Aufgabe, die mit standard-javascript...
Du musst angemeldet sein, um einen Kommentar abzugeben.
hier ist der Einzeiler 🙂
mit
underscore.js
Sie tun können:Können Sie es manuell tun, ich verstehe nicht, warum "keine Schleifen". jQuery ist die Schleife auch in eine oder andere Weise:
OK! oneliner! keine sichtbaren loops!
Obwohl die Karte hat eine Schleife in der es Quelle, bin ich mir sicher. aber ich denke, dass dies der einzige Weg, dies zu tun, ohne eine sichtbare loop-Konstrukt. wenn es Missstände im globalen Namensraum von javascript und ist daher schmutzig.
Okay, noch besser:
und präziser
obwohl die Tasten() und Array#indexOf nicht funktionieren in älteren ecma-Versionen.
Müssen Sie gehen Sie durch die
source
's-Tasten, prüfen, ob Sie vorhanden ist (nicht, wenn Sie truthy wie gewohnt kopieren0
,''
,false
,null
,undefined
,NaN
) und kopieren Sie diesen Wert, um das Ergebnis-Objekt. Da Sie nicht wollen, überschreiben Sie die Quelle oder das Ziel ist, nicht ändern.