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

标签 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
 }]

最佳答案

这很简单,就是 Tree Traversal

所以你只需要遍历它并记住级别,同时在你处于其中时存储“Node ”。

例如这段代码

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

关于javascript - 如何正确取消嵌套并展平其中包含数组的 javascript 对象数组(X 次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41467499/

相关文章:

javascript - JS "click"事件仅有效一次

Javascript多维数组完整列获取设置

jquery - 迭代到元素数组

javascript - 如何修复使用 Sequelize Node Express Mysql 插入数据库的问题?

node.js - 尝试运行站点时 NodeJs 出错

javascript - 向端点发送请求时出现 SSLv3 错误

javascript - 如何在 React 应用程序中外部化选择选项?

javascript - bootstrap jquery文件上传和laravel

c - 仅当所有字节数组可用时如何组装多个字节数组

arrays - 将 AnyObject 选择性转换为数组会产生错误