Skip to content Skip to sidebar Skip to footer

Merge Specific Properties Of Objects Together With Javascript

So I have an array of objects like so: [ { name: 'Joe Smith', job: 'Custodian', age: 35, id: '3421' }, { name: 'George Henderson', job: 'CEO', age

Solution 1:

By using reduce to iterate through the array to build a new one, and simply check if the id is already inserted then concatenate the job otherwise insert the new object:

const arr = [
  { name: "Joe Smith", job: "Janitor", age: 35, id: "3421" },
  { name: "George Henderson", job: "CEO", age: 43, id: "5098" },
  { name: "Joe Smith", job: "Cook", age: 35, id: "3421" },
  { name: "Sam Doe", job: "Technician", age: 22, id: "1538" },
  { name: "Joe Smith", job: "Dishwasher", age: 35, id: "3421" } 
]

const result = arr.reduce((acc, cur) => {
    const duplicate = acc.find(e => e.id == cur.id)
    
    if (duplicate) {
	duplicate.job += ', ' + cur.job
    } else {
	acc.push(cur)
    }

    return acc
}, [])

console.log(result)

Solution 2:

With lodash, you could group the array and map the wanted properties.

var data = [{ name: "Joe Smith", job: "Janitor", age: 35, id: "3421" }, { name: "George Henderson", job: "CEO", age: 43, id: "5098" }, { name: "Joe Smith", job: "Cook", age: 35, id: "3421" }, { name: "Sam Doe", job: "Technician", age: 22, id: "1538" }, { name: "Joe Smith", job: "Dishwasher", age: 35, id: "3421" }],
    result = _(data)
        .groupBy('id')
        .map(array => ({ ...array[0], job: _.join(_.map(array, 'job'), ", ") }))
        .value();

console.log(result);
.as-console-wrapper { max-height: 100%!important; top: 0; }
<scriptsrc="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

Solution 3:

I would suggest using a temporary Map, so to avoid having to iterate each time to find whether the name is a duplicate (like with find).

Also, it seems better practice to let the multiple values of job be put in an array:

let data = [{name: "Joe Smith",job: "Janitor",age: 35,id: "3421"},{name: "George Henderson",job: "CEO",age: 43,id: "5098"},{name: "Joe Smith",job: "Cook",age: 35,id: "3421"},{name: "Sam Doe",job: "Technician",age: 22,id: "1538"},{name: "Joe Smith",job: "Dishwasher",age: 35,id: "3421"}];

let map = newMap(data.map(({name, job, age, id}) => [id, { name, job: [], age, id}]));
data.forEach(o => map.get(o.id).job.push(o.job));
let result = Array.from(map.values());

console.log(result);

If you really want to join the job arrays as comma separated values, then apply join(", ") on them, but I would go for the array.

Post a Comment for "Merge Specific Properties Of Objects Together With Javascript"