如何以最有效的方式完全调平(映射/减少/递归)未知深度的嵌套对象?

斯密特·加巴尼

我想做类似以下的事情,但以更大规模和更有效的方式。假设我有一个对象数组,其中每个对象都需要水平/展平。

转换这样的东西......

[{
  name: 'John Doe',
  address: {
    apartment: 1550,
    streetno: 167,
    streetname: 'Victoria',
  },
}, {
  name: 'Joe Smith',
  address: {
    apartment: 2,
    streetno: 111,
    streetname: 'Jones',
  },
}]

……到那个……

[{
  name: 'John Doe',
  apartment: 1550,
  streetno: 167,
  streetname: 'Victoria',
}, {
  name: 'Joe Smith',
  apartment: 2,
  streetno: 111,
  streetname: 'Jones',
}]

如上所示,address还有一个需要调平/展平的对象。

但最重要的是,人们事先并不知道对象/数据结构。因此,人们既不知道属性名称也不知道嵌套级别的深度。

彼得·塞利格

“所以在收到这个物体之前,你对它的结构知之甚少。”

OP 的主要任务实际上是任何给定的基于嵌套对象的数据结构平级为仅具有单个条目级别的对象。而且由于人们事先对数据结构一无所知,因此必须提出一种递归方法。

一旦实现,这种原因函数可以用作数组mapping 过程的回调。

递归实现本身是基于类型检测(区分Array- 和 -Object类型和原始值)和根据当前处理的类型的对象reduceentries(键值对) 。value

function recursivelyLevelObjectEntriesOnly(type) {
  let result = type;
  if (Array.isArray(type)) {

    result = type
      .map(recursivelyLevelObjectEntriesOnly);

  } else if (type && 'object' === typeof type) {

    result = Object
      .entries(type)
      .reduce((merger, [key, value]) => {

        if (value && 'object' === typeof value && !Array.isArray(value)) {

          Object.assign(merger, recursivelyLevelObjectEntriesOnly(value));
        } else {
          merger[key] = recursivelyLevelObjectEntriesOnly(value);
        }
        return merger;

      }, {});    
  }
  return result;
}

const sampleData = [{
  name: 'John Doe',
  address: { apartment: 1550, streetno: 167, streetname: 'Victoria' },
}, {
  name: 'Joe Smith',
  address: { apartment: 2, streetno: 111, streetname: 'Jones' },
}, {
  foo: {
    bar: "bar",
    baz: "baz",
    biz: {
      buzz: "buzz",
      bizz: [{
        name: 'John Doe',
        address: { apartment: 1550, streetno: 167, streetname: 'Victoria' },
      }, {
        name: 'Joe Smith',
        address: { apartment: 2, streetno: 111, streetname: 'Jones' },
      }, {
        foo: {
          bar: "bar",
          baz: "baz",
          biz: {
            buzz: "buzz",
            booz: {
              foo: "foo",
            },
          },
        },
      }],
      booz: {
        foo: "foo",
      },
    },
  },
}];

const leveledObjectData = sampleData.map(recursivelyLevelObjectEntriesOnly);
console.log({ leveledObjectData });

// no mutation at `sampleData`.
console.log({ sampleData });
.as-console-wrapper { min-height: 100%!important; top: 0; }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

完全映射出未知“深度”的对象(以及找到对象“深度”的最有效方法)

如何以最有效的方式检查相同的数组?

如何以最有效的方式迭代 List 并为其设置数据?

如何以最有效的方式在大量文件中搜索搜索词?

如何以最有效的方式创建多个camera2预览?

如何以最有效的方式计算最密集的利润组合?

如何以最有效的方式提取ViewContainerRef和ComponentRef?

如何以最有效的方式在数组中添加元素?

如何以最有效的方式在 datagridview 中填充生成的列?

Excel VBA宏-如何以最有效的方式合并2张工作表

动态规划(如何以最有效的方式发送消息)

如何以最有效的方式刷新控制台?(蛇游戏 C++)

反应:在状态中遍历嵌套对象以防止重复–最有效的方式?

如何以有效方式使用es6语法过滤类似于嵌套Sql Query的JSON数组对象

递归展平postgres中的嵌套jsonb,而没有未知的深度和未知的关键字段

如何在 SQL 中以最有效的方式应用嵌套 case when 语句?

如何以有效的方式以pythonic方式将每个元素嵌套列表到变量

以最有效的方式重构 JavaScript 对象数组

单例对象最有效的Aurelia绑定方式

引用嵌套对象的最有效方法

如何以优雅有效的方式在numpy数组上映射python可调用的?

如何以最有效的方式获取字典列表中最大值的对应键?

如何以最有效的方式在neo4j图中创建一对多关系?

哪种递归调用最有效?

展平对象值的最佳/最有效方法是什么?

如何以有效的方式与基于键的对象的 Arraylist 进行比较

Java如何以有效的方式为对象生成和分配属性?

如何有效减少映射器的输入长度

最有效的进口方式