首页 > 解决方案 > 过滤数组中的复杂数据并返回一个新数据

问题描述

我有一个这样的数组:

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

你能帮我弄清楚我错过了什么吗?谢谢。

标签: javascriptarraystypescriptfilter

解决方案


假设您的输出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);


推荐阅读