如何正确地使用一个数组嵌套和压扁一个javascript对象数组(X次)

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

我想把这个变成只是一个对象数组,并返回它被发现的级别。 解决scheme不一定是简单的JavaScript,因为我在许多情况下使用lodash。 理想情况下,我还想在完成后删除“modelChildren”字段。

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

input:

[{ 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 }] 

这可能是相当简单的,它只是树遍历

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

例如这个代码

 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' } ]