如何正确地取消嵌套和展平其中包含数组的javascript对象数组(X次)

时间:2017-01-04 15:31:35

标签: javascript arrays node.js javascript-objects

我目前正在处理一个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
 }]

1 个答案:

答案 0 :(得分: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' } ]