8

我有这样的数组

abcArr = [["A", 10], ["B", 20], ["A",30],["C",40]]

如何按 A、B、C 对值进行分组和求和...

$.each(abcArr , function() {
    if (this[0] == this[0]) { 
      this[1] + this[1] 
    }; // I know this will simple double [1] values :(
});

期望的结果应该是

[["A", 40], ["B", 20], ["C",30]]
4

3 回答 3

18

这是一种简单的 javascript 方法,它收集地图中的唯一索引并按原样对它们进行总计,然后使用总计重新生成数组:

abcArr = [["A", 10], ["B", 20], ["A",30],["C",40]];

var items = {}, base, key;
for (var i = 0; i < abcArr.length; i++) {
    base = abcArr[i];
    key = base[0];
    // if not already present in the map, add a zeroed item in the map
    if (!items[key]) {
        items[key] = 0;
    }
    // add new item to the map entry
    items[key] += base[1];
}

// Now, generate new array
var outputArr = [], temp;
for (key in items) {
    // create array entry for the map value
    temp = [key, items[key]]
    // put array entry into the output array
    outputArr.push(temp);
}

// outputArr contains the result

工作演示:http: //jsfiddle.net/jfriend00/vPMwu/


这是使用 jQuery 的一种方法.each

abcArr = [["A", 10], ["B", 20], ["A",30],["C",40]];

var items = {}, base, key;
$.each(abcArr, function(index, val) {
    key = val[0];
    if (!items[key]) {
        items[key] = 0;
    }
    items[key] += val[1];
});

var outputArr = [];
$.each(items, function(key, val) {
    outputArr.push([key, val]);
});

// outputArr contains the result
document.body.innerHTML = JSON.stringify(outputArr);

工作演示:http: //jsfiddle.net/jfriend00/Q8LLT/

于 2013-01-20T18:32:27.857 回答
6

Underscore.jsgroupBy,剩下的可以通过mapping over来完成reduce(即每组缩减为一个元素

abcArr = [["A", 10], ["B", 20], ["A",30],["C",40]]

var grouped = _.groupBy(abcArr, function(x){return x[0]})
var result  = _.map(grouped, function(x){
    return _.reduce(x, function(x,y){
        return [y[0], x[1]+y[1]];
    }, [,0])
})

http://jsfiddle.net/srvKQ/

或(缩小)

abcArr = [["A", 10], ["B", 20], ["A",30],["C",40]]

var result = _.map(
    _.groupBy(abcArr, function(x){return x[0]}),
    function(x){return _.reduce(
        x, function(x,y){return [y[0], x[1]+y[1]]}, [,0]
)});

http://jsfiddle.net/srvKQ/1/

于 2013-01-20T19:05:34.877 回答
0

您可以使用Array.reduce()Map()

var abcArr= [["A", 10], ["B", 20], ["A",30],["C",40]]

var groupValues = abcArr.reduce(function (obj, item) {
    obj[item[0]] = obj[item[0]] || [];
    obj[item[0]] = +obj[item[0]] + +item[1]; // add (+) before variable so it's cast to numeric 
    return obj;
}, {});

var groupData = Object.keys(groupValues).map(function (key) {
    return [key, groupValues[key]];
});

console.log(groupData)

于 2020-03-18T08:29:48.900 回答