我有2个包含对象的数组,如下所示。
var arrayl = {
1: {url:google.com, score:0},
2: {url:bing.com, score: 2},
3: {url:yahoo.com, score: 0},
4: {url:facebook.com, score: 5},
5: {url:dopgile.com, score: 1},
6: {url:ask.com, score: 10},
7: {url:duckduckgo.com, score: 10}
},
array2 = {
1: {url:google.com, score: 2},
2: {url:facebook.com, score: 3},
3: {url:twitter.com, score: 0},
4: {url:duckduckgo.com, score: 0},
5: {url:mamma.com, score: 4},
6: {url:myspace.com, score: 5}
};
数组1和数组2本身都有唯一的元素。但是它们之间有重复。
我希望将Array 2与Array 1合并,以便在阵列1发生时将其重复元素的得分提高1。
例如,google.com出现在数组2和数组1中。当合并过程开始时,它会将数组1的第一个元素(google.com)的得分增加到1而不是0。它不应该添加array2的第一个元素,因为它是重复的。
类似地,元素2,3,5,6将合并而不会增加任何分数,因为array1中没有重复。但是,duckduck是一个复制品,会将array1 [7]中的duckduckgo.com的得分提高到11,而不是将它添加到数组中。
最后,数组应为:
var arrayl = {
1: {url:google.com, score:1},
2: {url:bing.com, score: 2},
3: {url:yahoo.com, score: 0},
4: {url:facebook.com, score: 5},
5: {url:dopgile.com, score: 1},
6: {url:ask.com, score: 10},
7: {url:duckduckgo.com, score: 11}
8: {url:facebook.com, score: 3},
9: {url:twitter.com, score: 0},
10: {url:mamma.com, score: 4},
11: {url:myspace.com, score: 5}
},
我尝试使用以下循环遍历数组。
for(var j=0; j<10;j++) {
for(var k=0; k<10; k++) {
if(array1[k].url==array2[j].url){
array1[k].changeRankScore(array1[k].score+1);
}else{
//this is the case where it is not the same. Ideally i should just push it to array1 but since it's a double loops, finally all the items will be added from array2 to array1 with several duplicates.
}
}
}
请帮助。
答案 0 :(得分:1)
创建一个对象,将URL映射到array1的元素:
var a1_assoc = {};
for (var i = 0; i < array1.length; i++) {
a1_assoc[array1[i].url] = array1[i];
}
然后在合并步骤中使用它:
for (i = 0; i < array2.length; i++) {
var url = array2[i].url;
if (a1_assoc[url]) {
a1_assoc[url].score++;
} else {
array1.push(array2[i]);
}
}
答案 1 :(得分:0)
不是进行双循环,而是在第二个数组上执行单个循环。对于每个项目,检查当前项目的URL是否包含在array1中 - 然后根据需要执行第一个或第二个案例。这样,您只需对每个array2条目执行一次操作。