0

I have array object -

[
 { 
  department:"Reviewer",
  name:"John"
 },
 { 
  department:"Reviewer",
  name:"Carol"
 },
 { 
  department:"Reviewer",
  name:"June"
 },
 { 
  department:"Assistant Reviewer",
  name:"Mac"
 },
 { 
  department:"Assistant Reviewer",
  name:"Issac"
 }
]

I want to convert this object into array object as below -

[
     { 
      department:"Reviewer",
      name:"John;Carol;June;"
     },
     { 
      department:"Assistant Reviewer",
      name:"Mac;Issac;"
     },
]

I tried using filter -

[... new Set(obj.department)].map((item)=>{return {item.name+";"} });

But this operation is dealing with only one element per item. Its not accumulating names.

2

4 Answers 4

2

Get a set of distinct departments, then map from them to the list of names

const data = [{"department":"Reviewer","name":"John"},{"department":"Reviewer","name":"Carol"},{"department":"Reviewer","name":"June"},{"department":"Assistant Reviewer","name":"Mac"},{"department":"Assistant Reviewer","name":"Issac"}]

console.log([...new Set(data.map(i=>i.department))].map(i=>({
  department: i, 
  name: data.filter(j=>j.department===i).map(j=>j.name).join(';')+';'})))

or, using reduce:

const data = [{"department":"Reviewer","name":"John"},{"department":"Reviewer","name":"Carol"},{"department":"Reviewer","name":"June"},{"department":"Assistant Reviewer","name":"Mac"},{"department":"Assistant Reviewer","name":"Issac"}]

console.log(Object.values(data.reduce((a,{department, name})=>
  (((a[department]??={department,name:''}).name+=`${name};`),a),{})))

Sign up to request clarification or add additional context in comments.

Comments

1

This would also work:

const input = [ { department: "Reviewer", name: "John", }, { department: "Reviewer", name: "Carol", }, { department: "Reviewer", name: "June", }, { department: "Assistant Reviewer", name: "Mac", }, { department: "Assistant Reviewer", name: "Issac", }, ];

const output = input.reduce((prev, { department, name }) => {
  const match = prev.find((item) => item.department === department);
  if (match) {
    match.name = `${match.name};${name}`;
  } else {
    prev.push({ department, name });
  }
  return prev;
}, []);

console.log(output);

Using Array.prototype.reduce() and Array.prototype.find()

Comments

1

Here is a solution using:

  • .reduce() to build an object that maps from department (aka key) to names (aka value)
  • .map() to transform that object into an array of objects with desired format

Note that this solution is faster than an array index search (aka other answers here) for large a large input array, at the cost of using a bit more memory.

const array = [
  { department: "Reviewer", name: "John" },
  { department: "Reviewer", name: "Carol" },
  { department: "Reviewer", name: "June" },
  { department: "Assistant Reviewer", name: "Mac" },
  { department: "Assistant Reviewer", name: "Issac" }
];

const result = Object.entries(array.reduce((acc, obj) => {
  if(acc[obj.department]) {
    acc[obj.department] += obj.name + ';';
  } else {
    acc[obj.department] = obj.name + ';';
  }
  return acc;
}, {})).map(arr => ({ department: arr[0], name: arr[1] }));

console.log(result);

Comments

1

This codes should work:

let data = [
  { department: "Reviewer", name: "John" },
  { department: "Reviewer", name: "Carol" },
  { department: "Reviewer", name: "June" },
  { department: "Assistant Reviewer", name: "Mac" },
  { department: "Assistant Reviewer", name: "Issac" }
];

let newData = [];
data.forEach((obj)=>{
  if(newData.filter(m => m.department == obj.department).length) {
    newData.find(n => n.department == obj.department).name += obj.name + ';'; 
  } else {
    newData.push({
      department: obj.department,
      name: obj.name + ';'
    })
  } 
});
console.log(newData);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.