lodash:从对象的数组计数值
问题描述:
我有对象的一个这样的数组: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但我不知道如何分组合并及计数功能,以实现所需的输出?
答
您可以_.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));
答
使用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
}
]
}
是否允许在您的情况下使用“native javascript”方法? – RomanPerekhrest
当然,虽然我在这个项目中使用lodash会比较有趣,比较如何可以没有。 – Gids