2016-05-28 4 views
0

Ich habe unter Array-Objekt in JavaScriptGruppe von Java-Script Array-Objekt

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

Was ist der beste Weg zu einer Gruppe von Array-Elemente sein wird, basierend auf Sprache und ihre Mittelwert in Java-Script.

Ich benutze unten Code zum Gruppieren.

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; 
     } 
+0

Ausgang gewünscht? Was hast du probiert? – 1983

Antwort

2

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);

0

Die verallgemeinern Methode:

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 
0

Ein Vorschlag mit dem gleichen Stil wie der Eingangs-Array.

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);

0

diesen Code Versuchen ..

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);

0

Nun OK .. für eine Änderung lässt dieses O tun (n) mit einem einzigen reduzieren.

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);