1

对不起,如果标题不是那么清楚。这对我来说有点难以解释,因为我在涉及多个数组时并不是那么好。

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

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

我该怎么做呢?

我尝试使用 21 和 18 作为数组,但是这样我不能在for循环中使用数组进行.length计数。我最终总共得到了 4 个阵列,几乎可以让它工作。


编辑:

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

我还希望能够迭代生成的数组/对象,并同时使用 21 和 18 个“键”来对我的页面进行一些进一步的更改。

已经感谢所有的回复!

4

5 回答 5

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

小提琴

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

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
于 2013-05-09T18:05:20.847 回答
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]];
}

在这里提琴

于 2013-05-09T18:08:22.970 回答
0

如果您的值不按顺序排列,您可以使用以下命令:

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

脚本:

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;
        }
    }
}
于 2013-05-09T18:25:39.390 回答
0

这是另一种可能性,它正在使用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 上

于 2013-05-09T18:28:00.813 回答
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;
}
于 2013-05-09T18:38:26.230 回答