2013-05-09 68 views
1

对不起,如果标题不清楚。这对我来说很难解释,因为在多个阵列中我不太好。如果第一个值相同,则Javascript将第二个数组值相加

我有一个数组:[ [21, 1000], [21, 500], [18, 100], [18, 200] ]

现在我想要得到这个结果数组:[ [21, 1500], [18, 300] ]

我如何去这样做呢?

我已经使用21和18阵列尝试,但这种方式我不能.length计数在for循环使用数组。我结束了总共4阵列几乎得到它的工作。


编辑:

我想避免使用21倍18的值作为数组键。

我也希望能够遍历结果数组/对象,并使用21和18“键”来对页面进行一些更改。

感谢您的所有答复!

+0

不能使用'for'但实际上你可以使用'。每()'的对象。 – 2013-05-09 18:03:20

+0

为什么不将数据存储为第二个数组中的对象? – Johan 2013-05-09 18:05:23

+0

不清楚在“第二”中没有找到“第一”元素的情况下,或者“第二”中有一对但“第一个”中没有匹配元素的情况下应该发生什么情况。 。这可能会使许多已经给出的答案不正确。 – Xotic750 2013-05-09 18:45:32

回答

2

你绝对不需要这方面的任何jQuery得到你要求的结果数组:

var one = [21, 18]; 
var two = [ [21, 1000], [21, 500], [18, 100], [18, 200] ]; 
var results = []; 

for(var i in one) { 
    results[i] = 0; 

    for(var x in two) 
     if(two[x][0] === one[i]) 
      results[i] = results[i] + two[x][1]; 

    results[i] = [one[i], results[i]]; 
} 

Fiddle这里

+0

我使用了这个解决方案,因为它允许我遍历'results'并在我的输出中使用21/18“keys”。 – jlmmns 2013-05-09 19:32:03

6

如何创建一个对象:

var arr = [ [21, 1000], [21, 500], [18, 100], [18, 200] ]; 
    obj = {}; 

for (i=0; i<arr.length; i++) { 
    obj[arr[i][0]] = (obj[arr[i][0]] || 0) + arr[i][1]; 
} 

// obj now equals {18: 300, 21: 1500} 
// obj[21] equals 1500 etc 

FIDDLE

你可以创建一个数组以同样的方式:

var arr = [ [21, 1000], [21, 500], [18, 100], [18, 200] ], 
    arr2 = []; 

for (i=0; i<arr.length; i++) { 
    arr2[arr[i][0]] = (arr2[arr[i][0]] || 0) + arr[i][1]; 
} 

// giving you the array [18: 300, 21: 1500] 
// where arr2[18] equals 300 
+0

@ryan - 不知道我明白了,为什么不能这么做 - > [Fiddle](http://jsfiddle.net/AF4Tt/1/)?阵列中的顺序并不重要! – adeneo 2013-05-09 18:12:41

+0

对不起,我被混淆了,因为我正在写点别的东西。第二个数组的顺序并不重要,但是,他有两个数组,他正在检查第一个数值与第二个数值。你完全忽略了第一个数组。 “if”语句的含义是:如果他有上述数组,但他的第一个数组看起来像这个'[53,18]'?这是缺乏处理我遇到的第一个阵列。 – Ryan 2013-05-09 18:19:03

+0

@ryan - 那是对象的要点。数组没有键,它们只有索引,所以根据第二个数组中的值创建一个对象,查看第一个数组中的值是否实际上是对象中的键是很微不足道的,因为对象实际上有键。 – adeneo 2013-05-09 18:33:58

0

的情况下,你的价值观是不是为了,你可以使用这个:

小提琴:
http://jsfiddle.net/acturbo/YWaja/

javasript:

var array1= [21, 18]; 
var array2 = [ [21, 1000], [21, 500], [18, 100], [18, 200] ]; 
var result = [ [0,0], [0,0] ]; 

for (i=0;i<array1.length;i++){ 

    result[0,i][0] = array1[i]; 

    for (j=0;j<array2.length;j++){ 

     var key = array2[i,j][0]; 
     var val = array2[i,j][1]; 

     if ( key == array1[i]){ 
      result[0,i][1] += val; 
     } 
    } 
} 
0

这里是另一种可能性,它是usi ng Array.forEach,所以你需要有一个现代化的浏览器或使用其中的许多“垫片”/“polyfills”。

的Javascript

var first = [21, 18], 
    second = [ 
     [21, 1000], 
     [21, 500], 
     [18, 100], 
     [18, 200] 
    ], 
    store = {}; 
    result = []; 


first.forEach(function (element) { 
    second.forEach(function (pair) { 
     var value; 

     if (pair[0] === element) { 
      value = store[element] || 0; 
      store[element] = value + pair[1]; 
     } 
    }); 

    if (typeof store[element] === "number") { 
     result.push([element, store[element]]); 
    } 
}); 

console.log(result); 

jsfiddle

更新:这里是基于更新的问题的解决方案,这也采用Object.keysArray.map从对象做转换到阵列格式的OP已经要求。

的Javascript

var first = [ 
     [21, 1000], 
     [21, 500], 
     [18, 100], 
     [18, 200] 
    ], 
    store = {}; 
    result; 

first.forEach(function (pair) { 
    store[pair[0]] = (store[pair[0]] || 0) + pair[1]; 
}); 

result = Object.keys(store).map(function (key) { 
    return [parseInt(key, 10), store[key]]; 
}); 

console.log(result); 

jsfiddle

0
function aggregateResults(indexes, inputArray) { 
    var ret = [], tmp; 
    for (var i=0; i<indexes.length; i++) { 
    tmp = 0; 
    for (var j=0; j<inputArray.length; j++) { 
     tmp += inputArray[j][0] == indexes[i] ? inputArray[j][1] : 0; 
    } 
    ret.push([indexes[i], tmp]) 
    } 
    return ret; 
}
相关问题