Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

combining duplicate values in JavaScript array

I have A json Object that contain some keys/values one of the values is an array I want combining the value of array from all recorded that have same key this is my Json Object

data= 
[
 {"key":11,"numbers":[555,556,557]},
 {"key":22,"numbers":[444,772,995,667]},
 {"key":11,"numbers":[223,447]},
 {"key":45,"numbers":[999,558,367]}
]

I want to get the result be like this

data= 
[
   {"key":11,"numbers":[555,556,557,223,447]},
   {"key":22,"numbers":[444,772,995,667]},
   {"key":45,"numbers":[999,558,367]}
]

I tried but I don't know how to cache the value of current matched row and try to find another matched value this is my code

data= 
[
 {"key":11,"numbers":[555,556,557]},
 {"key":22,"numbers":[444,772,995,667]},
 {"key":11,"numbers":[223,447]},
 {"key":45,"numbers":[999,558,367]}
];
function findDuplicates(data) {

 let result = [];

data.forEach(function(element, index) {

if (data.indexOf(element, index + 1) > -1) { 
  if (result.indexOf(element) === -1) {

    result.push(element.numbers.concat(data.indexOf(element, index + 1));
  }
}
});

return result;
}

console.log( findDuplicates(data) ); 
like image 801
Alan Nama Yosuf Avatar asked Mar 08 '26 14:03

Alan Nama Yosuf


1 Answers

You can use reduce to group the array into an object. Use concat to merge arrays. Use Object.values to convert the object to array.

let data = [
  {"key":11,"numbers":[555,556,557]},
  {"key":22,"numbers":[444,772,995,667]},
  {"key":11,"numbers":[223,447]},
  {"key":45,"numbers":[999,558,367]},
  {"key":45,"numbers":100}
];

let result = Object.values(data.reduce((c, {key,numbers}) => {
  c[key] = c[key] || {key,numbers: []};
  c[key].numbers = c[key].numbers.concat(Array.isArray(numbers) ? numbers : [numbers]); 
  return c;
}, {}));

console.log(result);
like image 175
Eddie Avatar answered Mar 10 '26 04:03

Eddie



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!