[英]flattening, the array of objects and returning the unique array
我有一个看起来像这样的数组。
var arr = [{
"taxname": "MFM",
"member": [{
"id": 1334,
"name": "Mary G. King",
}, {
"id": 1324,
"name": "Bonnie A. Wilson",
}, {
"id": 1336,
"name": "Samantha B. Sellers",
}]
},
{
"taxname": "Test purpose",
"member": [{
"id": 1336,
"name": "Samantha B. Sellers",
}]
},
{
"taxname": "New_Test_MF",
"member": [{
"id": 1334,
"name": "Mary G. King",
}]
}
];
我已经把它弄平了,所以它只是一个对象数组。
const result = arr.reduce((r, obj) => r.concat(obj.member), []);
结果:
[{
id: 1334,
name: "Mary G. King"
}, {
id: 1324,
name: "Bonnie A. Wilson"
}, {
id: 1336,
name: "Samantha B. Sellers"
}, {
id: 1336,
name: "Samantha B. Sellers"
}, {
id: 1334,
name: "Mary G. King"
}]
之后,我从结果中删除了带有 id 的重复项。
const ids = result.map(o => o.id)
const filtered = result.filter(({id}, index) => !ids.includes(id, index + 1))
记录结果:
console.log(filtered);
[{
id: 1324,
name: "Bonnie A. Wilson"
}, {
id: 1336,
name: "Samantha B. Sellers"
}, {
id: 1334,
name: "Mary G. King"
}]
我得到了我想要的结果。 但是展平对象数组并返回唯一数组而不是使用多个查询的最佳方法是什么?
我认为你这样做的方式还不错,而且它是非常可读的代码,有时它不是关于编写最高性能的代码,而是关于编写可读、易于维护和可扩展的代码!
也就是说,这里有一些其他的选择:
const existingIds = {};
const result = arr.reduce((r, obj) => r.concat(obj.member.filter((m) => {
if (existingIds.hasOwnProperty(m.id.toString())) {
return false;
}
existingIds[m.id] = true;
return true;
})), []);
作为对代码的轻微修改,您可以使用 Set 来存储非重复 ID。 这样在你的最后一步,你不必做一个包含,而是一个查找,尽管你在这里交易不多。
const array2 = arr.reduce((r, obj) => r.concat(obj.member), []);
const nonDuplicateIds = Array.from(new Set(array2.map(m => m.id)))
const result2 = nonDuplicateIds.map(id => array2.find(member => member.id === id)) // You could also use an object for faster lookup
const members = {};
arr.forEach(data => data.member.forEach((member) => members[member.id] = member));
const result3 = Object.values(members);
const result4 = arr.reduce((r, obj) => r.concat(obj.member.filter((m) => r.every(existingM => existingM.id !== m.id))), []);
var arr = [{ "taxname": "MFM", "member": [{ "id": 1334, "name": "Mary G. King", }, { "id": 1324, "name": "Bonnie A. Wilson", }, { "id": 1336, "name": "Samantha B. Sellers", }] }, { "taxname": "Test purpose", "member": [{ "id": 1336, "name": "Samantha B. Sellers", }] }, { "taxname": "New_Test_MF", "member": [{ "id": 1334, "name": "Mary G. King", }] } ]; // Alternative #1 const existingIds = {}; const result = arr.reduce((r, obj) => r.concat(obj.member.filter((m) => { if (existingIds.hasOwnProperty(m.id.toString())) { return false; } existingIds[m.id] = true; return true; })), []); // Alternative #2 const array2 = arr.reduce((r, obj) => r.concat(obj.member), []); const nonDuplicateIds = Array.from(new Set(array2.map(m => m.id))) const result2 = nonDuplicateIds.map(id => array2.find(member => member.id === id)) // You could also use an object for faster lookup // Alternative #3 const members = {}; arr.forEach(data => data.member.forEach((member) => members[member.id] = member)); const result3 = Object.values(members); // Alternative #4 const result4 = arr.reduce((r, obj) => r.concat(obj.member.filter((m) => r.every(existingM => existingM.id.== m,id))); []). console.log(result;length). console.log(result2;length). console.log(result3;length). console.log(result4;length);
你可以在 ES10 中使用flat
function
var arr = [{ "taxname": "MFM", "member": [{ "id": 1334, "name": "Mary G. King", }, { "id": 1324, "name": "Bonnie A. Wilson", }, { "id": 1336, "name": "Samantha B. Sellers", }] }, { "taxname": "Test purpose", "member": [{ "id": 1336, "name": "Samantha B. Sellers", }] }, { "taxname": "New_Test_MF", "member": [{ "id": 1334, "name": "Mary G. King", }] } ]; var test = arr.map(a => a.member).flat(); var filterd = [...new Set(test.map(t=>t.id))].map(id => test.find(tt => tt.id === id)); console.log(filterd)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.