2016-05-16 99 views
0

我有對象的一個​​這樣的數組:lodash:從對象的數組計數值

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

我想按的問題鍵和返回每個答案的計數。

例如

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

我能夠groupBy問題使用:使用.countBy().groupBy("question")和計數occurances但我不知道如何分組合並及計數功能,以實現所需的輸出?

+0

是否允許在您的情況下使用「native javascript」方法? – RomanPerekhrest

+0

當然,雖然我在這個項目中使用lodash會比較有趣,比較如何可以沒有。 – Gids

回答

2

您可以_.groupBy(array, 'question')開始 - 然後用.map

例如:

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

參見工作版本在:http://jsbin.com/wixoronoqi/edit?js,console

+3

我認爲使用[mapValues()](https://lodash.com/docs#mapValues)而不是[map()](https://lodash.com/docs#map)會更好,並且只是直接返回[countBy()](https://lodash.com/docs#countBy)值。 – ryeballar

+0

我不知道'mapValues',但是,使用'mapValues'會有所改進 – Filype

0

使用Array.forEachArray.push功能的 「本地JavaScript」 的解決方案:

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

輸出:

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