0

Group array of objects from response.

I have response like this.

[ {name:someName, value:20},
  {name:"", value:21}
  {name:someName, value:25}
  {name:someName , value:27}
  {name:"", value:21}
  {name:someName, value:20}
]

I want to group like this.

 [    {name:someName, value:20},
      {name:"", value:42}
      {name:someName, value:25}
      {name:someName , value:27}          
      {name:someName, value:20}
    ]

I tried with filter, reduce functions in Js

Daniel
  • 49
  • 3
  • 10

2 Answers2

0

You can try this with reduce:

const data = [ 
  {name: 'someName', value:20},
  {name: "", value:21},
  {name: 'someName1', value:25},
  {name: 'someName' , value:27},
  {name: "", value:21},
  {name: 'someName1', value:20},
];

const group = (data) =>

 data.reduce((acc, { name, value }) => {
  
  const item = acc.find((el) => el.name === name);

  if (item) item.value += value;

  else acc.push({ name, value });
  
  return acc;
 }, []);

console.log(group(data));

If you only want to group empty names find should be:

const item = acc.find((el) => el.name === name && !name);

as empty strings are falsy values.

Alex G
  • 1,897
  • 2
  • 10
  • 15
  • Thanks Alex G. Can you explain why you used this {name, value} ? – Daniel Feb 25 '19 at 13:51
  • @Daniel It's argument destructuring so you can reference object properties directly. Instead of arg.prop, you use prop. You can read more here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment – Alex G Feb 25 '19 at 13:55
0

You could reduce to a Map then use the values of that map and use Array.prototype.map with reduce again to summarize the groups:

const data = [
  { name: 'a', value: 20 },
  { name: '', value: 21 },
  { name: 'a', value: 25 },
  { name: 'b', value: 27 },
  { name: '', value: 21 },
  { name: 'c', value: 20 },
];

console.log(
  [
    ...data
      .reduce(
        (result, item) =>
          result.set(
            item.name,
            (result.get(item.name) || []).concat(item),
          ),
        new Map(),
      )
      .values(),
  ].map((items) =>
    items.reduce(
      (result, item) =>
        console.log(result, item) || {
          name: item.name,
          value: item.value + result.value,
        },
    ),
  ),
);
HMR
  • 37,593
  • 24
  • 91
  • 160