重新组织一个包含对象的javascript数组

4
我有一个问题和不同答案的数组(我动态构建,因此输入和不同答案的数量可能会有所变化):
var qaArray = [
    { question: "Question", answer: "Answer A"},
    { question: "Question", answer: "Answer B"},
    { question: "Question", answer: "Answer B"},
    { question: "Question", answer: "Answer C"},
    { question: "Question", answer: "Answer A"},
    { question: "Question", answer: "Answer B"},
    { question: "Question", answer: "Answer C"},
    { question: "Question", answer: "Answer A"},
    { question: "Question", answer: "Answer B"},
]

我需要一个函数来构建另一个数组对象,其中包含“answer”和“count”。在这种情况下,它将是:
[
    { answer: "Answer A", count: 3 },
    { answer: "Answer B", count: 4 },
    { answer: "Answer C", count: 2 },
]

有没有一种简单的方法来做到这一点,而不需要使用直接的循环?

我建议您在这里使用 lodash 并使用 groupBy 轻松执行它。 - Koushik Chatterjee
4个回答

3
如果您已掌握ES6,可以这样实现:

var qaArray = [
    { question: "Question", answer: "Answer A"},
    { question: "Question", answer: "Answer B"},
    { question: "Question", answer: "Answer B"},
    { question: "Question", answer: "Answer C"},
    { question: "Question", answer: "Answer A"},
    { question: "Question", answer: "Answer B"},
    { question: "Question", answer: "Answer C"},
    { question: "Question", answer: "Answer A"},
    { question: "Question", answer: "Answer B"},
];

var result = [...new Set(qaArray.map(q => q.answer))].map(a => ({ answer: a, count: qaArray.filter(e => e.answer === a).length }));

console.log(result);


2
你可以使用reduce来实现这个功能。其概念是:如果元素不存在,则将其添加到累加器中;如果存在,则增加count计数。
请参见下面的解决方案。

var qaArray = [
    { question: "Question", answer: "Answer A"},
    { question: "Question", answer: "Answer B"},
    { question: "Question", answer: "Answer B"},
    { question: "Question", answer: "Answer C"},
    { question: "Question", answer: "Answer A"},
    { question: "Question", answer: "Answer B"},
    { question: "Question", answer: "Answer C"},
    { question: "Question", answer: "Answer A"},
    { question: "Question", answer: "Answer B"},
]


result = qaArray.reduce((acc, item) => {
  var exist = acc.find(x => x.answer === item.answer);
  if (exist) {
    exist.count += 1;
  } else {
    acc.push({
      answer: item.answer,
      count: 1
    })
  }
  return acc;
}, []);


console.log(result);


2
如果您想要不使用reduceforEach的解决方案,这里提供了一种使用lodash的冗长方式。 _.countBy可以给您一个接近的结果,但如果您想将其转换为所需的数组,请使用mapValues
_.chain(qaArray)
.countBy('answer')
.mapValues(function(value, key) {
  return { answer: key, count: value }
})
.values()
.value()

1
你可以使用 Map 将答案作为键,然后对数据进行 reduce 操作以获取计数,如下所示:
var result = Array.from(qaArray.reduce((acc, { answer }) => {
  const current = acc.get(answer) || { answer, count: 0 };
  current.count++;
  return acc.set(answer, current);
}, new Map()).values());

console.log(result);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接