【问题标题】:Reduce object, grouping by a key [closed]减少对象,按键分组[关闭]
【发布时间】:2021-09-08 09:07:31
【问题描述】:

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

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


    【解决方案1】:

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

    【讨论】:

    • 在 IE/Edge 中,展开运算符出现错误,即 const newNode = { ...curr }。有什么建议吗?
    • @pee2pee IE 问题。你能查一下stackoverflow.com/questions/64536121/…
    • 好的,我已经对扩展运算符问题进行了排序,但不支持箭头功能,因此需要更大的修复
    猜你喜欢
    • 2018-10-20
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多