How to count the occurrences of the values of an array in a array of objects

I have an array of objects like this

[
  {
    entry: 1,
    answer: "[\"aaa\",\"bbb\"]"
  },
  {
    entry: 2,
    answer: "[\"ccc\",\"bbb\"]"
  },
  {
    entry: 3,
    answer: "[\"ccc\",\"bbb\"]"
  }
]

Note that the value in answer is a stringified array. I would like to count how many occourrence of each answer and get back an object like

{
  "aaa": 1,
  "ccc": 2,
  "bbb": 3,
}

what I tried so far:

const countAnswers = (ans) => {
    return ans.reduce(function (obj, v) {
        obj[v.answer] = (obj[v.answer] || 0) + 1;
        return obj;
    }, {});
};

this function counts any occourrence of the stringified answer but I don’t understand how to revert the stringify array and count the elements within it.

>Solution :

Use JSON.parse().

const countAnswers = (ans) => {
    return ans.reduce(function (obj, v) {
        const answersParsed = JSON.parse(v.answer);
        
        answersParsed.forEach((answer) => {
            obj = (obj || 0) + 1;
        });
        
        return obj;
    }, {});
};

const answers = [
  {
    entry: 1,
    answer: "[\"aaa\",\"bbb\"]"
  },
  {
    entry: 2,
    answer: "[\"ccc\",\"bbb\"]"
  },
  {
    entry: 3,
    answer: "[\"ccc\",\"bbb\"]"
  }
];

console.log(countAnswers(answers));

Leave a Reply