【问题标题】:Group by java-script Array object按 java-script 数组对象分组
【发布时间】:2016-05-28 12:48:46
【问题描述】:

我在 JavaScript 中有以下数组对象

  [ ["English", 52], ["Hindi", 154], ["Hindi", 241], ["Spanish", 10], ["French", 65], ["German", 98], ["Russian", 10] ]

根据语言及其在 java-script 中的平均值按数组项分组的最佳方法是什么。

我正在使用下面的代码进行分组。

function (Scores) {
            var map = {};
            for (var i = 0; i < Scores.length; i++) {
                var score = map[Scores[i][0]];

                if (score) {

                    score = { 'Sum': score.Sum + Scores[i][1], 'Count': score.Match + 1, 'Language': Scores[i][0] };
                    score.Avg = Math.round(score.Sum / score.Count);
                    map[Scores[i][0]] = score;

                } else {
                    map[Scores[i][0]] = { 'Sum': Scores[i][1], 'Count': 1, 'Language': Scores[i][0], 'Avg': Scores[i][1] };
                }

            }

            return map;
        }

【问题讨论】:

  • 想要的输出?你试过什么?

标签: javascript arrays algorithm


【解决方案1】:

var data = [["English", 52], ["Hindi", 154], ["Hindi", 241], ["Spanish", 10],
        ["French", 65], ["German", 98], ["Russian", 10]];

var aggregate = data.reduce(function(prev,curr){
    var key = curr[0];
    if(!prev[key]){
        prev[key]={lang:key,count:0,total:0};
    }
    var dt = prev[key];
    dt.count++;
    dt.total+=curr[1];
    dt.avg=dt.total/dt.count;  
    return prev;
},{});

console.log(aggregate);

【讨论】:

    【解决方案2】:

    泛化方法:

    var groupList =   [ ["English", 52], ["Hindi", 154], ["Hindi", 241], ["Spanish", 10], ["French", 65], ["German", 98], ["Russian", 10] ]
    function groupByProperty (groupList, groupIndex) {
        var groupBy = {};
        groupList.forEach(function(group){
            if(groupBy[group[groupIndex]]){
                groupBy[group[groupIndex]].push(group);
            }
            else {
                groupBy[group[groupIndex]] = [];
                groupBy[group[groupIndex]].push(group)
            }
        })
        for(key in groupBy){
            if (groupBy.hasOwnProperty(key)) {
                console.log(key + ',' + JSON.stringify(groupBy[key]))
            }
        }
    }
    groupByProperty(groupList,0)//For state
    groupByProperty(groupList,1)//For average
    

    【讨论】:

      【解决方案3】:

      与输入数组样式相同的提案。

      var data = [["English", 52], ["Hindi", 154], ["Hindi", 241], ["Spanish", 10], ["French", 65], ["German", 98], ["Russian", 10]],
          result = [];
      
      data.forEach(function (a) {
          if (!this[a[0]]) {
              this[a[0]] = { data: [], result: [a[0], 0] };
              result.push(this[a[0]].result);
          }
          this[a[0]].data.push(a[1]);
          this[a[0]].result[1] = this[a[0]].data.reduce(function (a, b) { return a + b; }) / this[a[0]].data.length;
      }, Object.create(null));
      
      console.log(result);

      【讨论】:

        【解决方案4】:

        试试这个代码..

        var items = [ ["English", 52], ["Hindi", 154], ["Hindi", 241], ["Spanish", 10], ["French", 65], ["German", 98], ["Russian", 10] ];
        for(var i=0;i<items.length;i++)
        {
          var sum=items[i][1],cnt=1,avg=0;
          for(var j=i+1;j<items.length;j++)
          {    
            if(items[i][0] == items[j][0]){
              sum+=items[j][1];
              cnt++;
              items.splice(j, 1);
            } 
          }
          avg = sum/cnt;
          items[i][1] = avg;
        }
        
        console.log(items);

        【讨论】:

          【解决方案5】:

          好吧..为了改变,让我们用一个 reduce 来完成这个 O(n)。

          var data = [ ["English", 52], ["Hindi", 154], ["Hindi", 241], ["Spanish", 10], ["French", 65], ["German", 98], ["Russian", 10] ],
              avrg = (a) => a.reduce((p,c) => p+c)/a.length,
           reduced = data.reduce((p,c,i,a) => ((a[c[0]]) ? (a[c[0]].v.push(c[1]),
                                                            p[a[c[0]].j][1] = avrg(a[c[0]].v))
                                                         : (a[c[0]] = {"v":[c[1]], "j":p.length},
                                                            p.push([c[0],c[1]])),
                                               p),[]);
          console.log(reduced);

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-10-14
            • 2021-11-19
            • 1970-01-01
            • 2021-03-29
            • 1970-01-01
            • 2020-02-14
            相关资源
            最近更新 更多