javascript - 减少对象,按键分组
问题描述
我有以下几乎是我需要的地方
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"]
...
解决方案
采用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);
推荐阅读
- vue.js - 这可行,但我认为它违背了使用框架的目的
- bash - 如何在 bash 中使用多个菜单实现 DRY 编程
- apache-spark - 在 Apache Spark 中查找每台机器计算的分区数
- sql - SSIS Oracle Source 仅输出 1 个字符
- python - 有没有办法从菜单栏中的当前项目中移除焦点并选择另一个链接?
- java - 生成 Javaassist 运行时 POJO 时出现异常
- c# - 在 TFS 2018 API 中管理工作项的创建和更新
- sql-server - 如何使用 SSIS 中派生列中的表达式解析字符串
- ios - 处理“手机”URL 方案在真实设备上不起作用
- java - 有没有办法将 java bean 添加到 javafx 场景