在对象数组中查找已更改的对象

时间:2015-02-08 07:53:39

标签: javascript underscore.js

使用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.

DEMO

如何实现以下目标?

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使用了答案中的技巧,并证明它无法找到想要的差异。

1 个答案:

答案 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)