使用Javascript对象数组,我想编辑一些值,然后获取一组已更改的对象。
a=[{x:1,y:2},{x:2,y:4}];
b = _.clone(a);
// When I change b, a is also changed. I can no longer know the original a.
////////////////////////////////
a=[{x:1,y:2},{x:2,y:4}];
b = _.map( a, _.clone );
// When I change b, a is not changed,
// but I cannot find only the changed JSONs.
// Every JSON between a and b are considered different.
如何实现以下目标?
a=[{x:1,y:2},{x:2,y:4}];
b = SOME_CLONE_OF_a;
b[0].x=5;
DIFF(b,a) // want to get [{x:5,y:2}]
DIFF(a,b) // want to get [{x:1,y:2}]
将帖子
此问题与How do you clone an array of objects using underscore?
答案提供了回答这个问题(如何克隆),但没有回答我的问题(如何克隆并知道差异)。
这个问题中的DEMO使用了答案中的技巧,并证明它无法找到想要的差异。
答案 0 :(得分:1)
快速而肮脏解决方案?使用JSON.stringify
深度比较对象。
console.group('map');
a=[{x:1,y:2},{x:2,y:4}];
b = _.map( a, _.clone ); // https://stackoverflow.com/questions/21003059/how-do-you-clone-an-array-of-objects-using-underscore
console.log( 'diff', _.difference(b,a) ); // all different
b[0].x=5;
console.log( 'a[0]', a[0] ); // a[0] does not change with b[0]
console.log( 'b[0]', b[0] );
console.log( 'diff', _.difference(b,a) ); // all different
console.groupEnd('map');
console.log(_.difference(_.map(a, JSON.stringify), _.map(b, JSON.stringify)))
console.log(_.map(_.difference(_.map(a, JSON.stringify), _.map(b, JSON.stringify)), JSON.parse))
console.log(_.difference(_.map(b, JSON.stringify), _.map(a, JSON.stringify)))
console.log(_.map(_.difference(_.map(b, JSON.stringify), _.map(a, JSON.stringify)), JSON.parse))
正确解决方案?实现像这个问题中讨论的uniqArrays这样的东西:
Finding nested duplicate arrays in JavaScript. (Nested Array uniq in lodash/underscore)