1

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.

0

3 Answers 3

1

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));

Sign up to request clarification or add additional context in comments.

Comments

1

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)

Comments

1

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]))))

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.