jquery array group by

后端 未结 3 1621
萌比男神i
萌比男神i 2020-11-29 13:02

I have array like this

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

how can I group and sum values by A, B, C...

<         


        
相关标签:
3条回答
  • 2020-11-29 13:41

    Here's a plain javascript way to do it that collects the unique indexes in a map and totals them as it does, then regenerates the array with the totals:

    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
    

    Working demo: http://jsfiddle.net/jfriend00/vPMwu/


    Here's a way using jQuery's .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);
    

    Working demo: http://jsfiddle.net/jfriend00/Q8LLT/

    0 讨论(0)
  • 2020-11-29 13:51

    You can use Array.reduce() and 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)

    0 讨论(0)
  • 2020-11-29 13:57

    Underscore.js has groupBy, and the rest can be done by mapping over reduce (that is, reducing each group to one element

    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/

    Or (minified)

    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/

    0 讨论(0)
提交回复
热议问题