【问题标题】:Javascript forEach an Array of Object recursiveJavascript forEach 一个对象数组递归
【发布时间】:2020-04-24 01:33:33
【问题描述】:


我需要一些帮助来循环使用对象数组的对象

这是一个示例对象:

const node = {
    documents: [{
        name: "test1"
    }],
    children: [{
        documents: [{
            name: "test2"
        }],
        children: [{
            documents: [{
                name: "test3"
            }],
            children: []
        }]
    }]
};


我的问题
我从这里尝试了一些解决方案,但这并不是我所需要的。基本上我想将文档数组中的每个对象移动到子数组中。
我已经知道了,但目前它只在第一个对象中这样做,所以不是递归的......
如果不创建弗兰肯斯坦式的代码,我就无法弄清楚...
我试过了 就像我在使用之前提到的那样

Array.concat()

将文档附加到子级,但仅在第一个对象中。
应该是什么样子

const node = {
    children: [
    {
    name: "test1"
    },
    {
    children: [
        {
      name: "test2"
      },
      {
      children: [
        {name: "test3"}
      ]
      }
    ]
    }
  ]
};

现在,在每个“深度”中,文档都“附加”到子级。
这应该发生在每个子键(深度)上。

有好心人帮帮我吗?


编辑:

我想我的例子还不够好。以下是一些实际数据:

      const node = {
        id: 1,
        name: "Root Node",
        documents: [
          { name: "Doc Root 1", id: 1234 },
          { name: "Doc Root 2", id: 1235 }
        ],
        children: [
          {
            id: 2,
            name: "Sub Node Node1",
            documents: [
              { name: "Doc SubNote 1 1", id: 1236 },
              { name: "Doc SubNote 1 2", id: 1237 }
            ],
            children: [{
              id: 3,
              name: "Sub Sub Node Node 1",
              documents: [
                { name: "Doc SubSubNote 1 1", id: 1238 },
                { name: "Doc SubSubNote 1 2", id: 1239 }
              ],
              children: null,
              addTreeNodeDisabled: true,
              addLeafNodeDisabled: true,
              editNodeDisabled: true,
              delNodeDisabled: true,
            }],
            addTreeNodeDisabled: true,
            addLeafNodeDisabled: true,
            editNodeDisabled: true,
            delNodeDisabled: true,
          }
        ],
        addTreeNodeDisabled: true,
        addLeafNodeDisabled: true,
        editNodeDisabled: true,
        delNodeDisabled: true,
      };

【问题讨论】:

  • documents可以生孩子吗?
  • 没有文档总是包含对象的数组
  • 数据结构比较混乱。请添加它想要的结果。
  • 抱歉,我搞砸了导出 :( 现在它是一个更好的例子

标签: javascript arrays object javascript-objects


【解决方案1】:

您可以通过再次调用该函数将文档副本与子文档连接起来。

var f = ({ documents, children, ...o }) => {
        children = [...(documents || []), ...(children || [])].map(f);
        return children.length
            ? { ...o, children }
            : o;
    },
    data = { id: 1, name: "Root Node", documents: [{ name: "Doc Root 1", id: 1234 }, { name: "Doc Root 2", id: 1235 }], children: [{ id: 2, name: "Sub Node Node1", documents: [{ name: "Doc SubNote 1 1", id: 1236 }, { name: "Doc SubNote 1 2", id: 1237 }], children: [{ id: 3, name: "Sub Sub Node Node 1", documents: [{ name: "Doc SubSubNote 1 1", id: 1238 }, { name: "Doc SubSubNote 1 2", id: 1239 }], children: null, addTreeNodeDisabled: true, addLeafNodeDisabled: true, editNodeDisabled: true, delNodeDisabled: true, }], addTreeNodeDisabled: true, addLeafNodeDisabled: true, editNodeDisabled: true, delNodeDisabled: true, }], addTreeNodeDisabled: true, addLeafNodeDisabled: true, editNodeDisabled: true, delNodeDisabled: true },
    result = f(data);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 这很好,但我有一个错误。在某些情况下,children 可以为 null,并引发长度未定义错误。
  • 添加 (children && children .length) 而不是 children .length
  • 你能看看我的编辑吗?我无法让您的代码使用这些数据运行。它运行,但丢失了一些键:(
【解决方案2】:

我在这里使用递归来实现结果。

const node = {"documents":[{"name":"test1"}],"children":[{"documents":[{"name":"test2"}],"children":[{"documents":[{"name":"test3"}],"children":[]}]}]}

const unwrap = (v) => ({...{...v}[0]});

const merge = (node) => ([...node.documents, {children: (unwrap(node.children).hasOwnProperty("children") ? merge(unwrap(node.children)) : node.children) }]);

console.log(merge(node));

【讨论】:

  • 嗨,也许您可​​以尝试使用我编辑的数据。我不能让你的工作:(
  • 数据集相差无几,我建议您为此添加一个不同的问题,并添加一个具有清晰准确数据结构的较小对象。
猜你喜欢
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 2019-09-27
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
相关资源
最近更新 更多