3

This is my code snippet

let mainData = [
  { "date": "210201", "cordinatePoint": 0, "current": 105827649.12000011, "previous": null },
  { "date": "210101", "cordinatePoint": 0, "previous": 0, "current": null },
  { "date": "210202", "cordinatePoint": 1, "current": 0, "previous": null },
  { "date": "210102", "cordinatePoint": 1, "previous": 0, "current": null },
  { "date": "210102", "cordinatePoint": 2, "previous": 0, "current": null }
];
let data = [];

for (let i = 0; i < mainData.length - 1; i++) {
  if (mainData[i].cordinatePoint === mainData[i + 1].cordinatePoint) {
    mainData[i].current = mainData[i].current + mainData[i + 1].current;
    mainData[i].previous = mainData[i].previous + mainData[i + 1].previous;
    data.push(mainData[i]);
  }
}
            
console.log(data); // where is cordinatePoint:2 ???

I want to find duplicate key value based on cordinatePoint and add their current and previous value. I want to even push the non-duplicate items as it is in new array. I'm unable to achieve the second part. Can someone have a word on this please?

Majed Badawi
  • 27,616
  • 4
  • 25
  • 48
Shoeb Mirza
  • 912
  • 1
  • 11
  • 30
  • Try a reduce and add another array to push to in the reduce – mplungjan Feb 21 '21 at 15:42
  • Does this answer your question? [How to merge two arrays in JavaScript and de-duplicate items](https://stackoverflow.com/questions/1584370/how-to-merge-two-arrays-in-javascript-and-de-duplicate-items) – Mark Schultheiss Feb 21 '21 at 16:23

1 Answers1

0

You're iterating until mainData.length-1 so the last element is ignored. Moreover, it will also be ignored because of the condition as it has no "next" element. Try this:

const mainData = [
  { "date": "210201", "cordinatePoint": 0, "current": 105827649.12000011, "previous": null },
  { "date": "210101", "cordinatePoint": 0,  "previous": 0, "current": null },
  { "date": "210202", "cordinatePoint": 1, "current": 0, "previous": null },
  { "date": "210102", "cordinatePoint": 1, "previous": 0, "current": null },
  { "date": "210102", "cordinatePoint": 2, "previous": 0, "current": null }
];

const data = [];
for (let i = 0; i < mainData.length; i++) {
  const obj = mainData[i];
  if (mainData[i + 1] && obj.cordinatePoint===mainData[i + 1].cordinatePoint) {
    obj.current = obj.current + mainData[i + 1].current;
    obj.previous = obj.previous + mainData[i + 1].previous;
    i++;
  }
  data.push(obj);
}
            
console.log(data);

A better solution using .reduce:

const mainData = [
  { "date": "210201", "cordinatePoint": 0, "current": 105827649.12000011, "previous": null },
  { "date": "210101", "cordinatePoint": 0,  "previous": 0, "current": null },
  { "date": "210202", "cordinatePoint": 1, "current": 0, "previous": null },
  { "date": "210102", "cordinatePoint": 1, "previous": 0, "current": null },
  { "date": "210102", "cordinatePoint": 2, "previous": 0, "current": null }
];

const data = mainData.reduce((acc,item) => {
  let { cordinatePoint, previous, current } = item;
  previous = previous||0;
  current = current||0;
  const obj = acc[cordinatePoint];
  if(obj) { obj.previous += previous; obj.current += current; }
  else { acc[cordinatePoint] = {...item, previous, current}; }
  return acc;
}, []);
            
console.log(data);
Majed Badawi
  • 27,616
  • 4
  • 25
  • 48