首页 > 解决方案 > 减少对象,按键分组

问题描述

我有以下几乎是我需要的地方

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/

这通过称为“名称”的键对对象进行分组/减少。

然而,它似乎嵌套了键的值,所以使用上面的数组,对于 Bob,我得到:

{
  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"
}

但是,我需要的是名为“name”的键是一个值数组或逗号分隔的字符串。有什么建议吗?

所以我需要类似的东西:

...
name: ["value1","value2"]
...

标签: javascript

解决方案


采用Array.reduce

逻辑

  • 循环遍历数组。
  • 将节点推送到累加器
  • 在推送之前验证累加器中是否已经存在具有相同id和用户名的节点。
  • 如果是,则将当前节点的名称推送到该节点的名称数组中
  • 如果不将节点推送到累加器,名称为数组,当前名称的值作为第一个元素。

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);


推荐阅读