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.
CodePudding user response:
Use JSON.parse().
const countAnswers = (ans) => {
return ans.reduce(function (obj, v) {
const answersParsed = JSON.parse(v.answer);
answersParsed.forEach((answer) => {
obj[answer] = (obj[answer] || 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));
CodePudding user response:
This seems to work:
const data = [
{
entry: 1,
answer: "[\"aaa\",\"bbb\"]"
},
{
entry: 2,
answer: "[\"ccc\",\"bbb\"]"
},
{
entry: 3,
answer: "[\"ccc\",\"bbb\"]"
}
]
const result = data.reduce( (c,e) => (JSON.parse(e.answer).forEach(a => c[a] = (c[a] ?? 0) 1), c), {} );
console.log(result)
console.log('sorted', Object.fromEntries(Object.entries(result).sort( (e1, e2) => e1[0].localeCompare(e2[0]))))
CodePudding user response:
const data = [{"entry":1,"answer":"[\"aaa\",\"bbb\"]"},{"entry":2,"answer":"[\"ccc\",\"bbb\"]"},{"entry":3,"answer":"[\"ccc\",\"bbb\"]"}]
let r =
data.flatMap(i=>JSON.parse(i.answer)).reduce((a,c)=>(a[c]??=0,a[c] ,a),{})
console.log(r)