#!/usr/bin/env node
var _ = require('underscore');
var a = [{f: 1}, {f:5}, {f:10}];
var b = _.clone(a);
b[1].f = 55;
console.log(JSON.stringify(a));
Das führt zu:
[{"f":1},{"f":55},{"f":10}]
Klon scheint nicht zu funktionieren! Also ich RTFM und sehe das:
http://underscorejs.org/#clone
Erstellen Sie einen flach kopierten Klon des Objekts. Verschachtelte Objekte oder Arrays werden als Referenz kopiert und nicht dupliziert.
Ist _.clone
also ziemlich nutzlos. Gibt es eine Möglichkeit, das Array von Objekten tatsächlich zu kopieren?
Antworten:
Nun, es gibt einen Trick! Wenn der Klon verschachtelte Objekte nicht "klont", können Sie dies erzwingen, indem Sie jedes Objekt innerhalb eines Kartenaufrufs explizit klonen! So was:
Drucke:
Yay!
a
ist unverändert! Ich kann jetztb
nach meinen Wünschen bearbeiten !quelle
Eine andere Lösung, die aus dem Problem in Github extrahiert wurde und mit jeder Ebene verschachtelter Daten funktioniert und keinen Unterstrich erfordert:
quelle
JSON.stringify
ein Fehler ausgegeben. Was im Original nicht der Fall ist, aber immer noch ein interessanter Zustand ist.a = {simple: 'thing'}; a.cycle = a ; JSON.stringify(a)
.Date
oderRegex
Instanzen, werden sie in Strings serialisiert werden. Nicht das Ende der Welt, aber Sie müssen damit umgehen, wenn Sie dies verwenden undDate
Instanzen erwarten .undefined
, möchten Sie,JSON.parse(JSON.stringify(obj) || null)
sonst wird ein Fehler ausgegeben.function
insgesamt fallen.FWIW, lodash hat eine cloneDeep- Funktion:
quelle
Unterstrich API-Referenz :
... oder in diesem Fall ein Array klonen . Versuche dies:
Das Folgende ist ein Nachtrag, den ich nach Steves Kommentar unter -thx erstellt habe
Ein rekursiver Helfer für das Klonen von Vanilla JS (oder
_.clone
wenn gewünscht) :quelle
_.toArray(list)
klont keine Objekte in einem Array.var array1 = [{a: 1}, {a: 2}, {a: 3}];
var array2 = _.toArray(array1);
array2[0].a = 999;
console.log(array1[0]); --> {a: 999}
_.clone
in derelse
Bedingung verwenden kann;)