【问题标题】:Filtering the data in an array and return the adjusted array过滤数组中的数据并返回调整后的数组
【发布时间】:2019-12-09 12:10:54
【问题描述】:

我有一个这样的数组:

const arr = [
              { name: 'A', accounts: [a, b]},
              { name: 'B', accounts: [c, d]},
              { name: 'C', accounts: [e, f]},
              { name: 'A', accounts: [g, h]},
              { name: 'B', accounts: [i, j]}
];

我想像这样修改这个数组:

const arr = [
              { name: 'A', accounts: [a, b, g, h]},
              { name: 'B', accounts: [c, d, i, j]},
              { name: 'C', accounts: [e, f]}
]

这意味着将帐户项目与具有相同名称的对象组合在一起。

我就是这样尝试的:

returnGroupedArr = (arr) => {
              const result = arr.reduce((f, s) => {
                           f[s.name] = s[f.name];
                           f[s.name].push(s);
                           return f;
              }
}

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

【问题讨论】:

    标签: javascript arrays typescript ecmascript-6


    【解决方案1】:

    您在每次迭代时都会无条件地重新分配 name 的累加器属性。

    要解决这个问题并避免改变输入,如果名称尚不存在,请为该名称创建一个新数组,然后推送到该名称。然后通过映射其Object.entries 将其转换回对象数组:

    const arr = [
      { name: 'A', accounts: ['a', 'b']},
      { name: 'B', accounts: ['c', 'd']},
      { name: 'C', accounts: ['e', 'f']},
      { name: 'A', accounts: ['g', 'h']},
      { name: 'B', accounts: ['i', 'j']}
    ];
    
    const groupedObj = arr.reduce((a, { name, accounts }) => {
      if (!a[name]) {
        a[name] = [];
      }
      a[name].push(...accounts);
      return a;
    }, {});
    const grouped = Object.entries(groupedObj)
      .map(([name, accounts]) => ({ name, accounts }));
    
    console.log(grouped);

    【讨论】:

      【解决方案2】:

          const data = [
                        { name: 'A', accounts: ["a", "b"]},
                        { name: 'B', accounts: ["c", "d"]},
                        { name: 'C', accounts: ["e", "f"]},
                        { name: 'A', accounts: ["g", "h"]},
                        { name: 'B', accounts: ["i", "j"]}
          ];
          
          
          const newData = data.reduce((accum, curr, i) => {
              const atIndex = accum.findIndex((entry) => entry.name === curr.name);
              if(i !== atIndex && atIndex !== -1) {
                  const mergedAccounts = accum[atIndex].accounts.concat(curr.accounts);
                  return Object.assign([], accum, {[atIndex]: {...accum[atIndex], accounts: mergedAccounts}})
              }
              return accum.concat(curr);
          }, []);
          
          console.log(newData);

      这实际上只是一个循环中的合并/重复数据删除

      【讨论】:

        猜你喜欢
        • 2021-12-13
        • 1970-01-01
        • 2019-01-22
        • 2017-10-07
        • 1970-01-01
        • 2018-12-07
        • 1970-01-01
        • 2021-08-12
        • 1970-01-01
        相关资源
        最近更新 更多