Javascript Lodash重新分配对象数组以构建树

Javascript Lodash重新分配对象数组以构建树,javascript,arrays,object,lodash,Javascript,Arrays,Object,Lodash,有没有一种简单的方法可以将包含对象的数组重新分配到一个新数组中。我想使用Lodash库,但不知道如何在内部拆分和连接它。我需要这个来使用jstree库构建一个树 我有这样的想法: [ { 'text':'parent 1', 'children': [ { 'text':'children 3' } ] }, { 'text':'p

有没有一种简单的方法可以将包含对象的数组重新分配到一个新数组中。我想使用Lodash库,但不知道如何在内部拆分和连接它。我需要这个来使用jstree库构建一个树

我有这样的想法:

 [
      {
        'text':'parent 1',
        'children': [
          {
            'text':'children 3'
          }
        ]
      },
      {
        'text':'parent 2',
        'children': []
      },
      {
        'text':'parent 3',
        'children': []
      },
      {
        'text':'parent 1',
        'children': [
          {
            'text':'children 1',
            'children': []
          },
          {
            'text':'children 2',
            'children': []
          }
        ]
      }
    ] 
我想在改造后有下一个

[
  {
    'text':'parent 2',
    'children': []
  },
  {
    'text':'parent 3',
    'children': []
  },
  {
    'text':'parent 1',
    'children': [
      {
        'text':'children 1',
        'children': []
      },
      {
        'text':'children 2',
        'children': []
      },
      {
        'text':'children 3'
      }
    ]
  }
] 
如果“文本”相同,我想合并所有对象并连接它们的子对象

嵌套级别可以尽可能多,没有限制

[
  {
    'text':'parent 1',
    'children': [
      {
        'text':'children 2',
        'children': [
          {
            'text':'parent 3',
            'children': [
              {
                'text':'parent 4',
                'children': [
                  ...
                ]
              },
            ]
          },
        ]
      }
    ]
  }
]

可能吗

可以使用新的
Object.values()
和纯JS,您可以执行以下操作:

var数据=[
{
'text':'parent 1',
“儿童”:[
{
“文本”:“儿童3”
}
]
},
{
'text':'parent 2',
“儿童”:[]
},
{
'text':'parent 3',
“儿童”:[]
},
{
'text':'parent 1',
“儿童”:[
{
“文本”:“儿童1”,
“儿童”:[]
},
{
“文本”:“儿童2”,
“儿童”:[]
}
]
}
],
嵌套=对象.values(data.reduce((p,c)=>(p[c.text]==未定义?p[c.text]={id:c.text,children:c.children}
:p[c.text].children.push(…c.children),p),{});

console.log(嵌套)如果您只想组合具有相同“文本”的对象并删除重复项,使用lodash的一种解决方案可以是:

var d=[{
'text':'parent 1',
“儿童”:[]
}, {
“文本”:“父级2”,
“儿童”:[]
}, {
“文本”:“父3”,
“儿童”:[]
}, {
'text':'parent 1',
“儿童”:[{
“文本”:“儿童1”,
“儿童”:[]
}, {
“文本”:“儿童2”,
“儿童”:[]
}]
}];
var res=\减少(d,(备忘录,o)=>{
var ready=\u1.find(memo,o1=>o.text==o1.text);
已返回?(ready.children=ready.children.concat(o.children),memo):memo.concat(o);
}, []);
控制台日志(res)

最好的方法是创建函数,将元素逐个添加到树中,并返回每个步骤的结果树。但在插入之前,您需要检查当前步骤中的完整树(开始为空),并与树中存在的所有元素、父元素和子元素进行比较。(可能是吗?)您可以从叶子(最后的子元素)或父元素开始,这两种方法都有自己的技巧。您可以发布您需要的输出吗?@Nidhin是的,我已经添加了谢谢,它几乎满足了我的要求,但是子数组现在由数组组成,而不是对象。“有可能以某种方式改变它吗?”ConstantineGolub当然,我已经用一个可能的解决方案更新了答案。结果是否如预期?谢谢谢谢,它现在可以工作了,但是看起来最大嵌套级别是2,有可能以某种方式修复它吗?@ConstantineGolub您可能需要使用递归来构造结果。解决方案将取决于您使用的数据结构(节点在阵列中的方式)。你能提供一个完整的例子吗?我已经在issueThanks的描述中添加了嵌套数据的例子,现在它有了一个all树的根。有可能省略它吗?@Constantine Golub你是对的,我已经重构了我的代码。检查一下:)