Javascript:在这种情况下如何避免嵌套 foreach?

时间:2021-04-14 07:03:44

标签: javascript

给大家! 我有以下数据:

const datas = [
  {
    first: 'id',
    secondLevel: [
      {
        second: 'id2',
        thirdLevel: ['a', 'b', 'c']
      },
      ...
    ]
    ...
  }
  ...
]  

我的目标是用 3 个级别的数据创建所有可能的关联

例如

[
  { 
    first: 'id', 
    second: 'id2', 
    third: 'a' 
  },
  { 
    first: 'id', 
    second: 'id2', 
    third: 'b' 
  },
  ...
]

我目前正在使用 foreach in a foreach in a foreach 来做这件事,这太可怕了,我相信我可以做得更好。

有人可以帮助我吗?谢谢!

1 个答案:

答案 0 :(得分:1)

您可以采用递归方法并首先获取值部分和数组。然后迭代数组并从数组中获取一个值或对象以进行扁平化。

最后将值部分与其余部分相加,得到一个平面对象数组。

这种方法适用于未知深度。 Mabe 一个好主意是省略带有 Level 后缀的键名,这将省略切片。

const
    flat = object => {
        let value, array;
        Object.entries(object).forEach(([k, v]) => {
            if (Array.isArray(v)) array = { k: k.slice(0, -5), v };
            else value = { [k]: v };
        });
        return array.v.flatMap(o => o && typeof o === 'object'
            ? flat(o).flatMap(q => ({ ...value, ...q }))
            : { ...value, [array.k]: o }
        );

    },
    data = [{ first: 'id', secondLevel: [{ second: 'id2', thirdLevel: ['a', 'b', 'c'] }] }],
    result = data.flatMap(flat);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }