-5

I have the following which is almost where I need to be

var baseData= [{
    "id": 1,
    "username": "JJ",
    "lastLoggedIn": null,
    "archive": false,
    "forename": "J",
    "surname": "J",
    "band": "Band 7",
    "role": "Developer",
    "competency": "Kicks",
    "employeeNumber": null,
    "name": "Sedation"
}, {
    "id": 1,
    "username": "JJ",
    "lastLoggedIn": null,
    "archive": false,
    "forename": "J",
    "surname": "J",
    "band": "Band 7",
    "role": "Developer",
    "competency": "Kicks",
    "employeeNumber": null,
    "name": "Safeguarding Level 3"
}, {
    "id": 1,
    "username": "JJ",
    "lastLoggedIn": null,
    "archive": false,
    "forename": "J",
    "surname": "J",
    "band": "Band 7",
    "role": "Developer",
    "competency": "Kicks",
    "employeeNumber": null,
    "name": "Safeguarding Level 2"
}, {
    "id": 276,
    "username": "IH",
    "lastLoggedIn": null,
    "archive": false,
    "forename": "I",
    "surname": "Hashmi",
    "band": "Band 8",
    "role": "Chap",
    "competency": "Pie",
    "employeeNumber": null,
    "name": "Safeguarding Level 3"
}, {
    "id": 276,
    "username": "IH",
    "lastLoggedIn": null,
    "archive": false,
    "forename": "I",
    "surname": "Hashmi",
    "band": "Band 8",
    "role": "Chap",
    "competency": "Pie",
    "employeeNumber": null,
    "name": "Safeguarding Level 2"
}, {
    "id": 276,
    "username": "IH",
    "lastLoggedIn": null,
    "archive": false,
    "forename": "I",
    "surname": "Hashmi",
    "band": "Band 8",
    "role": "Chap",
    "competency": "Pie",
    "employeeNumber": null,
    "name": "Major Incident"
}, {
    "id": 277,
    "username": "LC",
    "lastLoggedIn": null,
    "archive": false,
    "forename": "L",
    "surname": "C",
    "band": "Band 9",
    "role": "Lady",
    "competency": "Pizza",
    "employeeNumber": null,
    "name": "WMH ED Nursing"
}, {
    "id": 277,
    "username": "LC",
    "lastLoggedIn": null,
    "archive": false,
    "forename": "L",
    "surname": "C",
    "band": "Band 9",
    "role": "Lady",
    "competency": "Pizza",
    "employeeNumber": null,
    "name": "Sedation"
}, {
    "id": 277,
    "username": "LC",
    "lastLoggedIn": null,
    "archive": false,
    "forename": "L",
    "surname": "C",
    "band": "Band 9",
    "role": "Lady",
    "competency": "Pizza",
    "employeeNumber": null,
    "name": "Safeguarding Level 3"
}, {
    "id": 281,
    "username": "MJ",
    "lastLoggedIn": null,
    "archive": false,
    "forename": "M",
    "surname": "J",
    "band": "Band 9",
    "role": "Solutions Developer Manager",
    "competency": "Ninja",
    "employeeNumber": "23546329",
    "name": "Digital Team"
}, {
    "id": 283,
    "username": "CG",
    "lastLoggedIn": null,
    "archive": false,
    "forename": "C",
    "surname": "G",
    "band": "5",
    "role": "Senior Solutions Developer",
    "competency": "LOL",
    "employeeNumber": "23546205",
    "name": "WMH ED Medics"
}, {
    "id": 283,
    "username": "CG",
    "lastLoggedIn": null,
    "archive": false,
    "forename": "C",
    "surname": "G",
    "band": "5",
    "role": "Senior Solutions Developer",
    "competency": "LOL",
    "employeeNumber": "23546205",
    "name": "WMH ED Nursing"
}, {
    "id": 283,
    "username": "CG",
    "lastLoggedIn": null,
    "archive": false,
    "forename": "C",
    "surname": "G",
    "band": "5",
    "role": "Senior Solutions Developer",
    "competency": "LOL",
    "employeeNumber": "23546205",
    "name": "Sedation"
}, {
    "id": 283,
    "username": "CG",
    "lastLoggedIn": null,
    "archive": false,
    "forename": "C",
    "surname": "G",
    "band": "5",
    "role": "Senior Solutions Developer",
    "competency": "LOL",
    "employeeNumber": "23546205",
    "name": "Safeguarding Level 3"
}, {
    "id": 283,
    "username": "CG",
    "lastLoggedIn": null,
    "archive": false,
    "forename": "C",
    "surname": "G",
    "band": "5",
    "role": "Senior Solutions Developer",
    "competency": "LOL",
    "employeeNumber": "23546205",
    "name": "Safeguarding Level 2"
}, {
    "id": 283,
    "username": "CG",
    "lastLoggedIn": null,
    "archive": false,
    "forename": "C",
    "surname": "G",
    "band": "5",
    "role": "Senior Solutions Developer",
    "competency": "LOL",
    "employeeNumber": "23546205",
    "name": "Major Incident"
}, {
    "id": 284,
    "username": "Bob",
    "lastLoggedIn": null,
    "archive": true,
    "forename": "Bob",
    "surname": "Bob",
    "band": "Bob",
    "role": "Bob",
    "competency": "Bob",
    "employeeNumber": "XXX",
    "name": "WMH ED Medics"
}, {
    "id": 284,
    "username": "Bob",
    "lastLoggedIn": null,
    "archive": true,
    "forename": "Bob",
    "surname": "Bob",
    "band": "Bob",
    "role": "Bob",
    "competency": "Bob",
    "employeeNumber": "XXX",
    "name": "WMH ED Nursing"
}, {
    "id": 284,
    "username": "Bob",
    "lastLoggedIn": null,
    "archive": true,
    "forename": "Bob",
    "surname": "Bob",
    "band": "Bob",
    "role": "Bob",
    "competency": "Bob",
    "employeeNumber": "XXX",
    "name": "Sedation"
}, {
    "id": 284,
    "username": "Bob",
    "lastLoggedIn": null,
    "archive": true,
    "forename": "Bob",
    "surname": "Bob",
    "band": "Bob",
    "role": "Bob",
    "competency": "Bob",
    "employeeNumber": "XXX",
    "name": "Safeguarding Level 3"
}, {
    "id": 284,
    "username": "Bob",
    "lastLoggedIn": null,
    "archive": true,
    "forename": "Bob",
    "surname": "Bob",
    "band": "Bob",
    "role": "Bob",
    "competency": "Bob",
    "employeeNumber": "XXX",
    "name": "Safeguarding Level 2"
}, {
    "id": 284,
    "username": "Bob",
    "lastLoggedIn": null,
    "archive": true,
    "forename": "Bob",
    "surname": "Bob",
    "band": "Bob",
    "role": "Bob",
    "competency": "Bob",
    "employeeNumber": "XXX",
    "name": "Major Incident"
}];
    
    var newData = [];
    baseData.forEach(function(item, index) {
      if (newData.length === 0) {
        newData.push(item);
        
      } else {
        var dIndex = -1;
        newData.forEach(function(itm, idx) {
          if (item.id === itm.id) dIndex = idx;
        });
        
        if (dIndex !== -1) {
          var oldname = newData[dIndex].name;
          
          if (typeof(oldname).toString() === 'string') {
            newData[dIndex].name = [oldname, item.name];
          }
        } else {
          newData.push(item);
        }
      }
    });
    console.log(newData);

jsFiddle: https://jsfiddle.net/jeqdbn12/

This groups/reduces the object by the key called "name".

However it seems to nest the values for key, so using the array above, for Bob, I get:

{
  archive: true,
  band: "Bob",
  competency: "Bob",
  employeeNumber: "XXX",
  forename: "Bob",
  id: 284,
  lastLoggedIn: null,
  name: [[[[["WMH ED Medics", "WMH ED Nursing"], "Sedation"], "Safeguarding Level 3"], "Safeguarding Level 2"], "Major Incident"],
  role: "Bob",
  surname: "Bob",
  username: "Bob"
}

However, what I need is for the key called "name" to be an array of values or a comma delimited string. Any advice?

So I need something like:

...
name: ["value1","value2"]
...
TylerH
  • 20,799
  • 66
  • 75
  • 101
pee2pee
  • 3,619
  • 7
  • 52
  • 133

1 Answers1

2

Use Array.reduce

Logic

  • Loop through array.
  • Push the nodes to accumulator
  • Before pushing verify whether there is a node with same id and username already exist in the accumulator.
  • If yes, push the name of current node to the name array of that node
  • If not push the node to accumulator with name as a array with the value of current name as the first element.

const baseData = [{"id":1,"username":"JJ","lastLoggedIn":null,"archive":false,"forename":"J","surname":"J","band":"Band 7","role":"Developer","competency":"Kicks","employeeNumber":null,"name":"Sedation"},{"id":1,"username":"JJ","lastLoggedIn":null,"archive":false,"forename":"J","surname":"J","band":"Band 7","role":"Developer","competency":"Kicks","employeeNumber":null,"name":"Safeguarding Level 3"},{"id":1,"username":"JJ","lastLoggedIn":null,"archive":false,"forename":"J","surname":"J","band":"Band 7","role":"Developer","competency":"Kicks","employeeNumber":null,"name":"Safeguarding Level 2"},{"id":276,"username":"IH","lastLoggedIn":null,"archive":false,"forename":"I","surname":"Hashmi","band":"Band 8","role":"Chap","competency":"Pie","employeeNumber":null,"name":"Safeguarding Level 3"},{"id":276,"username":"IH","lastLoggedIn":null,"archive":false,"forename":"I","surname":"Hashmi","band":"Band 8","role":"Chap","competency":"Pie","employeeNumber":null,"name":"Safeguarding Level 2"},{"id":276,"username":"IH","lastLoggedIn":null,"archive":false,"forename":"I","surname":"Hashmi","band":"Band 8","role":"Chap","competency":"Pie","employeeNumber":null,"name":"Major Incident"},{"id":277,"username":"LC","lastLoggedIn":null,"archive":false,"forename":"L","surname":"C","band":"Band 9","role":"Lady","competency":"Pizza","employeeNumber":null,"name":"WMH ED Nursing"},{"id":277,"username":"LC","lastLoggedIn":null,"archive":false,"forename":"L","surname":"C","band":"Band 9","role":"Lady","competency":"Pizza","employeeNumber":null,"name":"Sedation"},{"id":277,"username":"LC","lastLoggedIn":null,"archive":false,"forename":"L","surname":"C","band":"Band 9","role":"Lady","competency":"Pizza","employeeNumber":null,"name":"Safeguarding Level 3"},{"id":281,"username":"MJ","lastLoggedIn":null,"archive":false,"forename":"M","surname":"J","band":"Band 9","role":"Solutions Developer Manager","competency":"Ninja","employeeNumber":"23546329","name":"Digital Team"},{"id":283,"username":"CG","lastLoggedIn":null,"archive":false,"forename":"C","surname":"G","band":"5","role":"Senior Solutions Developer","competency":"LOL","employeeNumber":"23546205","name":"WMH ED Medics"},{"id":283,"username":"CG","lastLoggedIn":null,"archive":false,"forename":"C","surname":"G","band":"5","role":"Senior Solutions Developer","competency":"LOL","employeeNumber":"23546205","name":"WMH ED Nursing"},{"id":283,"username":"CG","lastLoggedIn":null,"archive":false,"forename":"C","surname":"G","band":"5","role":"Senior Solutions Developer","competency":"LOL","employeeNumber":"23546205","name":"Sedation"},{"id":283,"username":"CG","lastLoggedIn":null,"archive":false,"forename":"C","surname":"G","band":"5","role":"Senior Solutions Developer","competency":"LOL","employeeNumber":"23546205","name":"Safeguarding Level 3"},{"id":283,"username":"CG","lastLoggedIn":null,"archive":false,"forename":"C","surname":"G","band":"5","role":"Senior Solutions Developer","competency":"LOL","employeeNumber":"23546205","name":"Safeguarding Level 2"},{"id":283,"username":"CG","lastLoggedIn":null,"archive":false,"forename":"C","surname":"G","band":"5","role":"Senior Solutions Developer","competency":"LOL","employeeNumber":"23546205","name":"Major Incident"},{"id":284,"username":"Bob","lastLoggedIn":null,"archive":true,"forename":"Bob","surname":"Bob","band":"Bob","role":"Bob","competency":"Bob","employeeNumber":"XXX","name":"WMH ED Medics"},{"id":284,"username":"Bob","lastLoggedIn":null,"archive":true,"forename":"Bob","surname":"Bob","band":"Bob","role":"Bob","competency":"Bob","employeeNumber":"XXX","name":"WMH ED Nursing"},{"id":284,"username":"Bob","lastLoggedIn":null,"archive":true,"forename":"Bob","surname":"Bob","band":"Bob","role":"Bob","competency":"Bob","employeeNumber":"XXX","name":"Sedation"},{"id":284,"username":"Bob","lastLoggedIn":null,"archive":true,"forename":"Bob","surname":"Bob","band":"Bob","role":"Bob","competency":"Bob","employeeNumber":"XXX","name":"Safeguarding Level 3"},{"id":284,"username":"Bob","lastLoggedIn":null,"archive":true,"forename":"Bob","surname":"Bob","band":"Bob","role":"Bob","competency":"Bob","employeeNumber":"XXX","name":"Safeguarding Level 2"},{"id":284,"username":"Bob","lastLoggedIn":null,"archive":true,"forename":"Bob","surname":"Bob","band":"Bob","role":"Bob","competency":"Bob","employeeNumber":"XXX","name":"Major Incident"}];
const newData = baseData.reduce((acc, curr) => {
  const node = acc.find((item) => item.id === curr.id && item.username === curr.username);
  if (node) {
    node.name.push(curr.name);
  } else {
    const newNode = { ...curr };
    newNode.name = [curr.name];
    acc.push(newNode)
  }
  return acc;
}, []);
console.log(newData);
Nitheesh
  • 19,238
  • 3
  • 22
  • 49
  • In IE/Edge, I get an error on the spread operator i.e. const newNode = { ...curr }. Any advice? – pee2pee Sep 24 '21 at 11:17
  • 1
    @pee2pee ite issue with IE. Can you check https://stackoverflow.com/questions/64536121/how-to-achieve-the-spread-operator-in-ie-11/64540648 – Nitheesh Sep 24 '21 at 11:26
  • Ok, I've sorted the spread operator issue but the arrow function isn't supported so would need a bigger fix – pee2pee Sep 24 '21 at 11:27