javascript - 过滤数组中的复杂数据并返回一个新数据
问题描述
我有一个这样的数组:
const arr = [
{ name: 'A', accounts: [{id: 0, data: {}}, {id: 1, data: {}}, {id: 0, data: {}}]},
{ name: 'B', accounts: [{id: 0, data: {}}, {id: 1, data: {}}]},
{ name: 'C', accounts: [{id: 2, data: {}}, {id: 2, data: {}}, {id: 2, data: {}}]},
];
我想像这样修改这个数组:
const arr = [
{ name: 'A', accounts: {joint: [{id: 0, data: {}}, {id: 0, data: {}}], individual: [{id: 1, data: {}}]}},
{ name: 'B', accounts: {joint: [], individual: [{id: 0, data: {}}, {id: 1, data: {}}]}},
{ name: 'C', accounts: {joint: [{id: 2, data: {}}, {id: 2, data: {}}, {id: 2, data: {}}], individual: []}},
];
这意味着,将相同的帐户 id 放在一个联合且不重复的 id 对象中。
这就是我尝试的方式:
for (let i = 0; i < arr.length - 1; i++) {
const compareValue = test[standard].id;
if (compareValue === test[i].id) {
joint.push(test[i]);
}
standard++;
}
if (joint.length > 0) {
if (joint.filter(account => account.id === test[standard].id).length > 0) {
joint.push(test[standard]);
} else {
individual.push(test[standard]);
}
}
if (joint.length === 1) {
const item = joint[0];
individual.push(item);
joint.pop();
}
} else {
individual.push(test[0]);
}
你能帮我弄清楚我错过了什么吗?谢谢。
解决方案
假设您的输出accounts
属性是一个对象:
我会先把问题分成几块。如果您能找到一种将单个accounts
数组转换为所需输出结构的方法,那么您就已经完成了大部分工作(其余的只是一个简单的.map
. 所以,我们只需要转
[{id: 0, data: {}}, {id: 1, data: {}}, {id: 0, data: {}}]
进入
{joint: [{id: 0, data: {}}, {id: 0, data: {}}], individual: [{id: 1, data: {}}]}
一种选择是遍历输入对象,并计算每个 id 的出现次数。然后,一旦有了计数,只需再次遍历输入对象,查找每个对象的计数。如果计数为 1,则将其推送到individual
数组,否则将其推送到joint
数组:
const arr = [
{ name: 'A', accounts: [{id: 0, data: {}}, {id: 1, data: {}}, {id: 0, data: {}}]},
{ name: 'B', accounts: [{id: 0, data: {}}, {id: 1, data: {}}]},
{ name: 'C', accounts: [{id: 2, data: {}}, {id: 2, data: {}}, {id: 2, data: {}}]},
];
const transformAccounts = (inputAccounts) => {
const occurrencesOfId = inputAccounts.reduce((a, { id }) => {
a[id] = (a[id] || 0) + 1;
return a;
}, {});
const joint = [];
const individual = [];
inputAccounts.forEach((obj) => {
if (occurrencesOfId[obj.id] > 1) {
joint.push(obj);
} else {
individual.push(obj);
}
});
return { joint, individual };
};
const output = arr.map(({ name, accounts }) => ({
name,
accounts: transformAccounts(accounts)
}));
console.log(output);
推荐阅读
- azure-active-directory - 即使在成功授权之后,directoryRoles 也会返回 Authorization_RequestDenied。在随后的重试中工作
- postgresql - Postgresql 查询执行时间过长
- mysql - MYSQL 从具有两列的表中删除重复项
- selenium - TestNG - 顺序和并行测试脚本的实现
- javascript - TypeError:无法读取反应js中未定义的属性'fn'
- r - 将特定时间间隔内来自 2 个不同数据集的值合并到单个数据集 (R)
- node.js - Reacord 从数据库中删除但收到错误:- 使用 axios、node、mongo 和 Koa 请求失败,状态码为 404
- spring - Http2 与 Http1.1 的性能问题
- java - 以下程序中缺少哪个类?
- mysql - 如何使用 Google BigQuery 在每个关卡中找到以前没有出现过的唯一用户?