[英]lodash: count values from array of objects
我有一個像這樣的對象數組:
[
{"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
問題: .groupBy("question")
並使用.countBy()
計算值的出現次數,但我不確定如何組合分組和計數功能來實現所需的輸出?
您可以從_.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
這是針對此問題的本機/vanilla js 解決方案,使用Array.reduce() ,帶有和不帶有擴展運算符。
使用擴展運算符,不可變樣式:
const questions = [ {"question":"Q1","answer":"my answer 2"}, {"question":"Q1","answer":"my answer"}, {"question":"Q1","answer":"my answer"}, {"question":"Q2","answer":"answer 2"} ]; const groupedQuestions = questions.reduce( (g, q) => { return { ...g, [q.question]: { ...g[q.question], [q.answer] : (g[q.question] && g[q.question][q.answer] || 0) + 1 } } }, {}) document.write(JSON.stringify(groupedQuestions))
沒有傳播運算符:
const questions = [ {"question":"Q1","answer":"my answer 2"}, {"question":"Q1","answer":"my answer"}, {"question":"Q1","answer":"my answer"}, {"question":"Q2","answer":"answer 2"} ]; const groupedQuestions = questions.reduce( (g, q) => { typeof g[q.question] !== "undefined" || (g[q.question] = {}); typeof g[q.question][q.answer] !== "undefined" || (g[q.question][q.answer] = 0); g[q.question][q.answer] += 1; return g; }, {}) document.write(JSON.stringify(groupedQuestions))
使用Array.forEach
和Array.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
}
]
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.