0

I am having one multidimensional array in JS, on that name is same we need to take the particular id and push into new array, how we can achieve this please any one help me

    var array1 = [
    {"id":"1", "name" : "2"},
    {"id":"2", "name" : "2"},
    {"id":"3", "name" : "3"},
    {"id":"4", "name" : "3"},
    {"id":"5", "name" : "4"},
];

Expected answer

var final = [
  { "name" : "2", "IDS" : ["1", "2"] },
  { "name" : "3", "IDS" : ["3", "4"] },
  { "name" : "4", "IDS" : ["5"] }
];
Mithuna M
  • 13
  • 4

5 Answers5

2

You can use reduce & findIndex. In reduce callback function check if the accumulator array have an object with specific name which can be done using findIndex. If the element with name exist then update the IDS array else push an object in the accumulator array

var array1 = [{
    "id": "1",
    "name": "2"
  },
  {
    "id": "2",
    "name": "2"
  },
  {
    "id": "3",
    "name": "3"
  },
  {
    "id": "4",
    "name": "3"
  },
  {
    "id": "5",
    "name": "4"
  },
];


let newArr = array1.reduce(function(acc, curr) {
  let findName = acc.findIndex((item) => {
    return item.name === curr.name;
  })

  if (findName === -1) {
    acc.push({
      name: curr.name,
      IDS: [curr.id]

    })
  } else {
    acc[findName].IDS.push(curr.id)
  }


  return acc;
}, []);

console.log(newArr)
brk
  • 48,835
  • 10
  • 56
  • 78
1

var array1 = [
    {"id":"1", "name" : "2"},
    {"id":"2", "name" : "2"},
    {"id":"3", "name" : "3"},
    {"id":"4", "name" : "3"},
    {"id":"5", "name" : "4"},
];

var newArray = [];
array1.map((data,index) =>{
     const isExist = newArray.filter(m => m.name === data.name);
     if(isExist.length > 0){
        isExist[0].IDS.push(data.id);
     }else{
          newArray.push({ name : data.name , IDS : [data.id]});
      }
});

console.log(newArray);
ankitkanojia
  • 3,072
  • 4
  • 22
  • 35
0

const array1 = [
    {"id":"1", "name" : "2"},
    {"id":"2", "name" : "2"},
    {"id":"3", "name" : "3"},
    {"id":"4", "name" : "3"},
    {"id":"5", "name" : "4"},
];

const newObj = array1.reduce((acc, val) => {
  if (acc[val.name]) {
    acc[val.name].ids.push(val.id);
  } else {
    acc[val.name] = {
      name: val.name,
      ids: [val.id]
    }
  } 
  return acc;
}, {});

console.log(Object.values(newObj));
Shubham
  • 1,755
  • 3
  • 17
  • 33
0

Just a simple loop over the array will be enough:

var array1 = [
    {"id":"1", "name" : "2"},
    {"id":"2", "name" : "2"},
    {"id":"3", "name" : "3"},
    {"id":"4", "name" : "3"},
    {"id":"5", "name" : "4"},
];

let result = [];

array1.forEach(elem => {
  let curr = result.filter(r => r.name == elem.name);
  if(curr.length == 1) {
    curr[0].ID.push(elem.id);
  } else {
    result.push({
      name: elem.name,
      ID: [elem.id]
    });
  }
});

console.log(result)
MauriceNino
  • 6,214
  • 1
  • 23
  • 60
0

Use Array.reduce() :

var array1 = [
    {"id":"1", "name" : "2"},
    {"id":"2", "name" : "2"},
    {"id":"3", "name" : "3"},
    {"id":"4", "name" : "3"},
    {"id":"5", "name" : "4"},
];

array1 = array1.reduce(function(acc,current){
   let existing = acc.find(item=> item.name==current.name);
if(existing){
  existing.ids.push(current.id);
}else{
  acc.push({name:current.name,ids:[current.id]});
}
return acc
},[]);

console.log(array1)
R.K.Saini
  • 2,678
  • 1
  • 18
  • 25