使用Javascript和Underscore.js,如何比较2个数组,如果匹配,则replace属性?

我有2个这样的数组:

var arrayOne = [ {page:'1',tags:['foo','bar']}, {page:'2',tags:['oh','boy']} ]; var arrayTwo = [ {page:'1',tags:['go','out']}, {page:'9b',tags:['red','blue','green']} ]; 

我想比较两个数组,如果page属性相同,则使用arrayOne中的tags属性replacearrayOne中的tags属性。

因此,考虑到上面的示例数组,只有arrayOne page: 1arrayOne将被arrayOne page: 1的值arrayTwo

我想我可以用underscore.js做到这一点,但我正在努力看到如何。

想法?

如果你实际上有两个这样的JavaScript对象数组:

 var a1 = [ {page: '1', tags: ['foo', 'bar']}, {page: '2', tags: ['oh', 'boy']}, //... ]; var a2 = [ {page: '1', tags: ['go', 'out']}, {page: '9b', tags: ['red', 'blue', 'green']}, //... ]; 

然后我会转换a2到一个页面到标签的查找表:

 var lookup = { }, i, e; for(i = 0, e = a2[i]; i < a2.length; e = a2[++i]) lookup[e.page] = e.tags; 

然后在你去的时候通过a1合并lookup值:

 for(i = 0, e = a1[i]; i < a1.length; e = a1[++i]) e.tags = lookup[e.page] || e.tags; 

演示: http : //jsfiddle.net/ambiguous/aDgH7/

如果您必须使用_.reduce_.each可以使用_.reduce_.eachreplace循环:

 var lookup = _(a2).reduce(function(lookup, e) { lookup[e.page] = e.tags; return lookup; }, { }); _(a1).each(function(e) { e.tags = lookup[e.page] || e.tags; }); 

演示: http : //jsfiddle.net/ambiguous/rkMZz/

如果您可以假设一个现代化的JavaScript,那么可以使用标准的reduceforEach数组方法:

 var lookup = a2.reduce(function(lookup, e) { lookup[e.page] = e.tags; return lookup; }, { }); a1.forEach(function(e) { e.tags = lookup[e.page] || e.tags; }); 

演示: http : //jsfiddle.net/ambiguous/cy2Qy/

如果你实际上有JSONstring的数组,那么你可以混合使用JSON.parseJSON.stringify调用来解压和重新包装数据。

喜欢

 var arrayOne = [ '{"page":"1","tags":["foo","bar"]}', '{"page":"2","tags":["oh","boy"]}' ]; var arrayTwo = [ '{"page":"1","tags":["go","out"]}', '{"page":"9b","tags":["red","blue","green"]}' ]; var maxLen = Math.max( arrayOne.length, arrayTwo.length ), objA, objB; while( maxLen-- ) { objA = JSON.parse( arrayOne[ maxLen ] ); objB = JSON.parse( arrayTwo[ maxLen ] ); if( objA.page === objB.page ) { objA.tags = objB.tags arrayOne[ maxLen ] = JSON.stringify( objA ); } } 

这几乎是一个完美的世界的例子。 如果数组1和数组2不包含相同数量的项目,则会变得更棘手。

我可以通过使用_each_each来完成我所需要的_each ,例如像这样( http://jsfiddle.net/4JP7g/ ):

 var arrayOne = [ {page:1,tags:["foo","bar"]}, {page:2,tags:["oh","boy"]} ]; var arrayTwo = [ {page:1,tags:["go","out"]}, {page:9,tags:["red","blue","green"]} ]; _.each(arrayOne, function(one){ _.each(arrayTwo, function(two){ if(one.page === two.page){ one.tags = two.tags; console.log (one.tags); } }); });​