1

我有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属性相同,将tagsinarrayOnetags属性替换为 from的属性arrayTwo

page: 1所以给定上面的示例数组,只有of的标签arrayOne会被替换为page: 1的值arrayTwo

我想我可以用 来做到这一点underscore.js,但我很难知道如何做。

想法?

4

3 回答 3

1

如果您实际上有两个这样的 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如果你必须使用下划线,你可以用and替换循环_.each

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/

如果您实际上有 JSON 字符串数组,那么您可以混合JSON.parseJSON.stringify调用来解包和重新打包数据。

于 2012-10-23T17:18:28.007 回答
0

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 不包含相同数量的项目,这会变得有点棘手。

于 2012-10-23T15:04:17.727 回答
0

我能够通过使用下划线来做我需要的事情,方法是像这样( http://jsfiddle.net/4JP7g/_each )在另一个内部做一个:

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);            
      }           
    });
});​
于 2012-10-23T17:25:31.920 回答