2016-05-16 14 views
0

Ich habe ein Array von Objekten wie folgt aus:lodash: Zählwerte von Array von Objekten

[ 
{"question":"Q1","answer":"my answer 2"}, 
{"question":"Q1","answer":"my answer"} 
{"question":"Q1","answer":"my answer"} 
{"question":"Q2","answer":"answer 2"} 
] 

ich zu einer Gruppe durch die Frage Schlüssel und geben die Zählungen jeder Antwort möchte.

z.B.

{ 
    "Q1": [{ 
     "answer": "my answer", 
     "count": 2 
    }, { 
     "answer": "my answer 2", 
     "count": 1 
    }], 
    "Q2": [{ 
     "answer": "answer 2", 
     "count": 1 
    }] 
} 

,

Ich bin in der Lage zu groupBy Fragen mit: .groupBy("question") und zählen Vorkommen von Werten .countBy() verwenden, aber ich bin nicht sicher, wie die Gruppierung zu kombinieren und Funktionen zählen die gewünschte Ausgabe zu erreichen?

+0

ist "native Javascript" -Ansatz in Ihrem Fall erlaubt? – RomanPerekhrest

+0

Sicher, obwohl ich Lodash in diesem Projekt verwende, wäre es interessant zu vergleichen, wie es ohne getan werden könnte. – Gids

Antwort

2

Sie können mit _.groupBy(array, 'question') beginnen - dann .map

Zum Beispiel verwenden:

var arr = [ 
{"question":"Q1","answer":"my answer 2"}, 
{"question":"Q1","answer":"my answer"}, 
{"question":"Q1","answer":"my answer"}, 
{"question":"Q2","answer":"answer 2"} 
]; 

var result = _(arr) 
    .groupBy('question') 
    .map(function(item, itemId) { 
    var obj = {}; 
    obj[itemId] = _.countBy(item, 'answer') 
    return obj 
    }).value(); 

console.log(JSON.stringify(result, null, 2)); 

Siehe die Arbeitsversion auf: http://jsbin.com/wixoronoqi/edit?js,console

+3

Ich denke, es wäre besser, [mapValues ​​()] (https://lodash.com/docs#mapValues) anstelle von [map()] (https://lodash.com/docs#map) und einfach zu verwenden geben Sie den Wert [countBy()] (https://lodash.com/docs#countBy) direkt zurück. – ryeballar

+0

Ich kannte "mapValues" nicht, aber es wäre eine Verbesserung, 'mapValues' zu verwenden – Filype

0

A "native Javascript" Lösung mit Array.forEach und Array.push Funktionen:

var arr = [{"question":"Q1","answer":"my answer 2"},{"question":"Q1","answer":"my answer"}, {"question":"Q1","answer":"my answer"}, {"question":"Q2","answer":"answer 2"}]; 

var result = {}; 
arr.forEach(function(v){ 
    var key = v['question'], Q = this[key], found = false; 
    if (Q) { 
     var len = Q.length; 
     while (len--) { 
      if (Q[len]['answer'] === v['answer']) { 
       Q[len]['count']++; 
       found = true; 
      } 
     } 
     if (!found) Q.push({'answer': v['answer'], 'count' : 1}); 
    } else { 
     this[key] = []; 
     this[key].push({'answer': v['answer'], 'count' : 1}); 
    } 
}, result); 

console.log(JSON.stringify(result, 0, 4)); 

Der Ausgang:

{ 
    "Q1": [ 
     { 
      "answer": "my answer 2", 
      "count": 1 
     }, 
     { 
      "answer": "my answer", 
      "count": 2 
     } 
    ], 
    "Q2": [ 
     { 
      "answer": "answer 2", 
      "count": 1 
     } 
    ] 
} 
Verwandte Themen