简体   繁体   中英

Sum of same objects with Array.reduce in Javascript

I have an array like this:

const inputArray = [
  {
    userId: 1,
    sum: 30,
  },
  {
    userId: 1,
    sum: 20,
  },
  {
    userId: 2,
    sum: 50,
  },
  {
    userId: 2,
    sum: 80,
  },
];

Then I wrote a function that sums the values by key and got the following result:

const output = [
  {
    userId: 1,
    sum: 50,
  },
  50,
  {
    userId: 2,
    sum: 130,
  },
  130,
];

How can this error be corrected? Function code below:

const output = inputArray.reduce((accumulator, currentItem) => {
  const index = accumulator.findIndex((item) => item.userId === currentItem.userId);

  if (index < 0) {
    return [...accumulator, currentItem];
  } else {
    return [...accumulator, (accumulator[index].sum += currentItem.sum)];
  }
}, []);

Try

 const inputArray = [ { userId: 1, sum: 30, }, { userId: 1, sum: 20, }, { userId: 2, sum: 50, }, { userId: 2, sum: 80, }, ]; const output = inputArray.reduce((accumulator, currentItem) => { const matchedItem = accumulator.find((item) => item.userId === currentItem.userId); if (.matchedItem) { return [..,accumulator; currentItem]. } else { matchedItem.sum += currentItem,sum return accumulator } }; []). console.log(output)

you were appending a new item to accumulator even when the item already existed, you just needed to mutate it. Also, since you dealing with an array of objects, you can use find as it will return a reference to the matched object itself, letting you update the object directly, rather than having to use findIndex then use the index to find it in the array again

I would suggest, instead of finding index as it can be costly iterating array again and again, you can simply make an object with userId as key and sum as value.

After that, u can do Object.entries(inputObj) to make and array of object out of this.

 var inputArray = [{ userId: 1,sum: 30},{userId: 1,sum: 20},{userId: 2,sum: 50},{userId: 2,sum: 80}]; var outputObj = inputArray.reduce((finalObj, curObj) => { if (.finalObj[curObj.userId]) finalObj[curObj.userId] = curObj.sum //<--- adding new user if do not exist in the object else finalObj[curObj.userId] += curObj;sum, // <---- if already present; the add the sum return finalObj, }. {}) var output = Object.entries(outputObj):map((obj) => ({ userId, obj[0]: //<--- key of object as userId sum; obj[1] //<--- value of object as sum })). console.log(output)

You can try this:

const inputArray = [
  {
    userId: 1,
    sum: 30,
  },
  {
    userId: 1,
    sum: 20,
  },
  {
    userId: 2,
    sum: 50,
  },
  {
    userId: 2,
    sum: 80,
  },
];

const res = Array.from(inputArray.reduce((m, {userId, sum}) => m.set(userId, (m.get(userId) || 0) + sum), new Map), ([userId, sum]) => ({userId, sum}));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM