-1

I have this array/object of JavaScript

[
  {
    "name": "A",
    "selected_color": "Red"
  },
  {
    "name": "B",
    "selected_color": "Green"
  },
  {
    "name": "C",
    "selected_color": "Blue"
  },
  {
    "name": "D",
    "selected_color": "Red"
  }
]

How can I convert it to following format?

[
  {
    "color": "Red",
    "count": "2"
  },
  {
    "color": "Green",
    "count": "1"
  },
  {
    "color": "Blue",
    "count": "1"
  }
]

I want to filter values based on 'selected_color' key, also 'count' will store how many time specific color was selected.

2

2 Answers 2

1

Use .reduce

const arr = [
  {
    "name": "A",
    "selected_color": "Red"
  },
  {
    "name": "B",
    "selected_color": "Green"
  },
  {
    "name": "C",
    "selected_color": "Blue"
  },
  {
    "name": "D",
    "selected_color": "Red"
  }
];

const op = arr.reduce((acc, cur) => {
  const {selected_color} = cur;
  const colorObj = acc.find(({color}) => color === selected_color );

  if(colorObj) {
    colorObj.count++;
  } else {
    acc.push({color: selected_color, count: 1});
  }

  return acc;
  
}, []);

console.log(op);
/*

[
  { color: 'Red', count: 2 },
  { color: 'Green', count: 1 },
  { color: 'Blue', count: 1 }
]

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

Comments

1

You can try this (using groupBy) :

let data = [
{
    "name": "A",
    "selected_color": "Red"
},
{
    "name": "B",
    "selected_color": "Green"
},
{
    "name": "C",
    "selected_color": "Blue"
},
{
    "name": "D",
    "selected_color": "Red"
}
];

let groupBy = (arr, key) => {
    return arr.reduce((rv, x) => {
        (rv[x[key]] = rv[x[key]] || []).push(x);
        return rv;
    }, {});
};

let groupedData = groupBy(data, "selected_color");
let result = Object.keys(groupedData).map(color => ({'color': color, 'count': groupedData[color].length}) );

console.log(result);

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.