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

Time:02-03

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)

  • Related