#!/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));
결과는 다음과 같습니다.
[{"f":1},{"f":55},{"f":10}]
클론이 작동하지 않는 것 같습니다! 그래서 나는 RTFM, 그리고 이것을보십시오 :
http://underscorejs.org/#clone
개체의 얕은 복사 된 복제본을 만듭니다. 중첩 된 개체 또는 배열은 복제되지 않고 참조로 복사됩니다.
그래서 _.clone
꽤 쓸모가 없습니다. 실제로 객체 배열을 복사하는 방법이 있습니까?
답변
음, 속임수가 있습니다! clone이 중첩 된 개체를 “복제”하지 않는 경우 맵 호출 내에서 각 개체를 명시 적으로 복제하여 강제로 실행할 수 있습니다. 이렇게 :
#!/usr/bin/env node
var _ = require('underscore');
var a = [{f: 1}, {f:5}, {f:10}];
var b = _.map(a, _.clone); // <----
b[1].f = 55;
console.log(JSON.stringify(a));
인쇄물:
[{"f":1},{"f":5},{"f":10}]
예이! a
변경되지 않았습니다! 이제 b
원하는대로 편집 할 수 있습니다 !
답변
답변
FWIW, lodash에는 cloneDeep 함수가 있습니다.
이 메서드는 값을 재귀 적으로 복제한다는 점을 제외하면 _.clone과 같습니다.
답변
_.toArray(list)
목록에서 실제 배열을 만듭니다 (반복 할 수있는 모든 항목). arguments 객체를 변환하는 데 유용합니다.
… 또는이 경우 어레이 복제 . 이 시도:
var _ = require('underscore');
var array1 = [{a:{b:{c:1}}},{b:{c:{a:2}}},{c:{a:{b:3}}}];
var array2 = _.toArray(array1);
console.log(array1 === array2); --> false
console.log(array1[0] === array2[0]); --> true
다음은 -thx 아래에 Steve의 의견 후에 만든 부록입니다.
Vanilla JS (또는 _.clone
원하는 경우 사용 ) 딥 클로닝 재귀 도우미 :
function clone(thing, opts) {
var newObject = {};
if (thing instanceof Array) {
return thing.map(function (i) { return clone(i, opts); });
} else if (thing instanceof Date) {
return new Date(thing);
} else if (thing instanceof RegExp) {
return new RegExp(thing);
} else if (thing instanceof Function) {
return opts && opts.newFns ?
new Function('return ' + thing.toString())() :
thing;
} else if (thing instanceof Object) {
Object.keys(thing).forEach(function (key) {
newObject[key] = clone(thing[key], opts);
});
return newObject;
} else if ([ undefined, null ].indexOf(thing) > -1) {
return thing;
} else {
if (thing.constructor.name === 'Symbol') {
return Symbol(thing.toString()
.replace(/^Symbol\(/, '')
.slice(0, -1));
}
// return _.clone(thing); // If you must use _ ;)
return thing.__proto__.constructor(thing);
}
}
var a = {
a: undefined,
b: null,
c: 'a',
d: 0,
e: Symbol('a'),
f: {},
g: { a:1 },
h: [],
i: [ { a:2 }, { a:3 } ],
j: [ 1, 2 ],
k: function (a) { return a; },
l: /[a-z]/g,
z: [ {
a: undefined,
b: null,
c: 'b',
d: 1,
e: Symbol(1),
f: {},
g: { b:2 },
h: { c:{ c:3 } },
i: { a:Symbol('b') },
j: { a:undefined, b:null },
k: [],
l: [ 1, [ 1, 2 ], [ [ 1, 2, 3 ] ] ],
m: function (a) { return !a; },
n: { a:function (a) { return !!a; } },
o: /(a|b)/i
} ]
};
var b = clone(a);
var c = clone(a, { newFns:true });
/* Results - value beneath each for reference:
a.a === b.a --> true
undefined
a.b === b.b --> true
null
a.c === b.c --> true
'a'
a.d === b.d --> true
0
a.e === b.e --> false
Symbol(a)
a.f === b.f --> false
{}
a.g === b.g --> false
{ a:1 }
a.h === b.h --> false
[]
a.i === b.i --> false
[ { a:2 }, { a:3 } ]
a.i[0] === b.i[0] --> false
{ a:2 }
a.i[0].a === b.i[0].a --> true
2
a.j === b.j --> false
[ 1, 2 ]
a.k === b.k --> true
a.k === c.k --> false
function (a) { return a; }
a.l === b.l --> false
/[a-z]/g
a.z === b.z --> false
[Object]
a.z[0].a === b.z[0].a --> true
undefined
a.z[0].b === b.z[0].b --> true
null
a.z[0].c === b.z[0].c --> true
'b'
a.z[0].d === b.z[0].d --> true
1
a.z[0].e === b.z[0].e -->
false
Symbol(1)
a.z[0].f === b.z[0].f --> false
{}
a.z[0].g === b.z[0].g -- > false
{ b:2 }
a.z[0].g.b === b.z[0].g.b --> true
2
a.z[0].h === b.z[0].h --> false
{ c:{ c:3 } }
a.z[0].h.c === b.z[0].h.c --> false
{ c:3 }
a.z[0].h.c.c === b.z[0].h.c.c --> true
3
a.z[0].i === b.z[0].i --> false
{ a:Symbol(b) }
a.z[0].i.a === b.z[0].i.a --> false
Symbol(b)
a.z[0].j === b.z[0].j --> false
{ a:undefined, b:null }
a.z[0].j.a === b.z[0].j.a --> true
undefined
a.z[0].k === b.z[0].k --> false
[]
a.z[0].l === b.z[0].l --> false
[ 1, [ 1, 2 ], [ [ 1, 2, 3 ] ] ]
a.z[0].l[1] === b.z[0].l[1] --> false
[ 1, 2 ]
a.z[0].l[1][1] === b.z[0].l[1][1] --> true
2
a.z[0].m === b.z[0].m --> true
a.z[0].m === c.z[0].m --> false
function (a) { return !a; }
a.z[0].n === b.z[0].n --> false
{ a:function (a) { return !!a; } }
a.z[0].n.a === b.z[0].n.a --> true
a.z[0].n.a === c.z[0].n.a --> false
function (a) { return !!a; }
a.z[0].o === b.z[0].o --> false
/(a|b)/i
*/