Reorganize an array of javascript objects

I have many questions and different answers (which I build dynamically, so the number of records and different answers can vary):

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"},
]

I need a function to create another array object from this that will contain the “answer” and “count”, in which case it will be:

[
    { answer: "Answer A", count: 3 },
    { answer: "Answer B", count: 4 },
    { answer: "Answer C", count: 2 },
]

Is there an easy way to do this without direct contours?

+4
source share
4 answers

If ES6 is not a problem, this can be done with:

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);
Run code
+3
source

If you are looking for a solution without reduceor forEach, here is a detailed way to use lodash .

_.countBy , , , mapValues.

_.chain(qaArray)
.countBy('answer')
.mapValues(function(value, key) {
  return { answer: key, count: value }
})
.values()
.value()
+2

You can use reducefor this. The concept is to push an element on the battery if it does not exist, and increase countit if it does.

Below you will find a solution.

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);
Run code
+2
source

You can use Mapto answer your answers, and then use reducethe data to get a count, for example:

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);
+1
source

Source: https://habr.com/ru/post/1690773/


All Articles