【问题标题】:How to properly un-nest and flatten an array of javascript objects with an array inside them (X-amount of times)如何正确地取消嵌套和展平包含数组的 javascript 对象数组(X 次)
【发布时间】:2017-05-18 23:04:13
【问题描述】:

我目前正在处理一个 javascript 对象数组,其中包含 X 数量的数组,其中包含相同类型的对象,在特定属性中(在本例中为“modelChildren”)

我想将其展平为一组对象,并返回找到它的级别。解决方案不必是纯 javascript,因为我在很多情况下都使用 lodash。理想情况下,我还想在完成后删除“modelChildren”字段。

任何帮助将不胜感激。 谢谢!

输入:

[{
  id: 1,
  name: foo
  modelChildren: [
   {
    id: 2,
    name: bar,
    modelChildren: [
      {
      id: 3,
      name: foobar
      },
      {
      id: 4,
      name: foobarfoo
      }
    ] 
   }
  ] 
}]

预期结果:

[{
   id: 1,
   name: foo,
   level: 1
 {
   id: 2,
   name: bar,
   level: 2
 },
 {
   id: 3,
   name: foobar,
   level: 3
 },
 {
   id: 4,
   name: foobarfoo
   level: 3
 }]

【问题讨论】:

    标签: javascript arrays node.js javascript-objects


    【解决方案1】:

    这很简单,就是Tree Traversal

    所以你只需要遍历它并记住关卡,同时在其中存储“节点”。

    例如这段代码

    const source = [{
        id: 1,
        name: 'foo',
        modelChildren: [
            {
                id: 2,
                name: 'bar',
                modelChildren: [
                    {
                        id: 3,
                        name: 'foobar'
                    },
                    {
                        id: 4,
                        name: 'foobarfoo'
                    }
                ]
            }
        ],
    }, {
        id: 5,
        name: 'foo',
        modelChildren: [
            {
                id: 6,
                name: 'bar',
                modelChildren: [
                    {
                        id: 7,
                        name: 'foobar'
                    },
                    {
                        id: 8,
                        name: 'foobarfoo'
                    }
                ]
            },
            {
                id: 9,
                name: 'bar',
                modelChildren: [
                    {
                        id: 10,
                        name: 'foobar'
                    },
                    {
                        id: 11,
                        name: 'foobarfoo'
                    }
                ]
            }
        ],
    }
    ];
    const newSource = [];
    const _ = require('lodash');
    
    function doIt(items, level) {
        if (!items) {
            return;
        }
    
        items.forEach(item => {
            newSource.push(_.merge({level}, _.pick(item, ['id', 'name'])));
            doIt(item.modelChildren, level + 1);
        })
    }
    
    doIt(source, 1);
    console.log(newSource);
    

    有这个输出

    [ { level: 1, id: 1, name: 'foo' },
      { level: 2, id: 2, name: 'bar' },
      { level: 3, id: 3, name: 'foobar' },
      { level: 3, id: 4, name: 'foobarfoo' },
      { level: 1, id: 5, name: 'foo' },
      { level: 2, id: 6, name: 'bar' },
      { level: 3, id: 7, name: 'foobar' },
      { level: 3, id: 8, name: 'foobarfoo' },
      { level: 2, id: 9, name: 'bar' },
      { level: 3, id: 10, name: 'foobar' },
      { level: 3, id: 11, name: 'foobarfoo' } ]
    

    【讨论】:

      猜你喜欢
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      • 2015-03-14
      • 1970-01-01
      • 2021-05-14
      相关资源
      最近更新 更多