【问题标题】:Flatten nested objects, keeping the properties of parents展平嵌套对象,保留父对象的属性
【发布时间】:2021-06-09 18:01:08
【问题描述】:

我有一个具有这种形状的数据结构:

[
  {
    a: "x",
    val: [
      { b: "y1", val: [1, 2, 3] },
      { b: "y2", val: [4, 5, 6] },
    ],
  },
];

一个具有 3 个级别的示例:

[
  {
    a: "x",
    val: [
      { b: "y1", val: [
        {c: "z1", val: [1, 2]}
      ] },
      { b: "y2", val: [
        { c: "z2", val: [3, 4] },
        { c: "z3", val: [5, 6, 7] },
        { c: "z4", val: [8] }
      ]  },
    ],
  },
];

每个对象总是有相同级别的嵌套,并且我提前知道了最大嵌套深度。我们也提前知道了键的名称:我们知道级别 1 的键将命名为 a,级别 2 的键将命名为 b,以此类推。

我正在寻找将第一个示例转换为的函数:

[
    {
      a: "x",
      b: "y1",
      val: [1, 2, 3],
    },
    {
      a: "x",
      b: "y2",
      val: [4, 5, 6],
    },
];

也就是说,一个平面数组,其值和键从父级继承。

我有一个适用于第一个示例的解决方案:

const res = [
  {
    a: "x",
    val: [
      { b: "y1", val: [1, 2, 3] },
      { b: "y2", val: [4, 5, 6] },
    ],
  },
].flatMap((x) => x.val.flatMap((d) => ({ a: x.a, ...d })));
console.log(res);

但我正在努力将其变成递归函数。

提前感谢您的帮助!

【问题讨论】:

  • 是否保证 values 对象不会是数字和对象的混合,例如:values: [ {b: "y1", values: [1, 2, 3]}, 1, 2, 3 ] 或者如果不是,您在这种情况下会做什么?
  • 每个对象只有一个数组吗?
  • @AbirTaheer 是的,它们不会是混合的。我在每个对象中也只有一个数组。

标签: javascript arrays recursion flatten


【解决方案1】:

你可以看看数组,如果里面没有对象返回一个对象,否则通过存储其他属性来映射val属性。

const
    isObject = o => o && typeof o === 'object',
    flat = array => {
        if (!array.every(isObject)) return { val: array };
        return array.flatMap(({ val, ...o }) => {
            const temp = flat(val);
            return Array.isArray(temp)
                ? temp.map(t => ({ ...o, ...t }))
                : { ...o, ...temp };
        });
    },
    data0 = [{ a: "x", val: [{ b: "y1", val: [1, 2, 3] }, { b: "y2", val: [4, 5, 6] }] }],
    data1 = [{ a: "x", val: [{ b: "y1", val: [{ c: "z1", val: [1, 2] }] }, { b: "y2", val: [{ c: "z2", val: [3, 4] }, { c: "z3", val: [5, 6, 7] }, { c: "z4", val: [8] }] }] }];

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

【讨论】:

    猜你喜欢
    • 2019-04-14
    • 1970-01-01
    • 2018-04-29
    • 2019-07-22
    • 2018-10-24
    • 2014-12-03
    • 2017-07-02
    • 2020-12-22
    • 2021-10-19
    相关资源
    最近更新 更多