有没有一种简短的方法可以将由对象组成的数组重新分配到一个新数组中。我想使用 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': [
...
]
},
]
},
]
}
]
}
]
这可能吗?
最佳答案
如果您只想合并具有相同“文本”的对象并删除重复项,使用 lodash 的一种解决方案可能是:
var d = [{
'text': 'parent 1',
'children': []
}, {
'text': 'parent 2',
'children': []
}, {
'text': 'parent 3',
'children': []
}, {
'text': 'parent 1',
'children': [{
'text': 'children 1',
'children': []
}, {
'text': 'children 2',
'children': []
}]
}];
var res = _.reduce(d, (memo, o) => {
var already = _.find(memo, o1 => o.text === o1.text);
return already ? (already.children = already.children.concat(o.children), memo) : memo.concat(o);
}, []);
console.log(res);
<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>
不过,此解决方案不包括构建超过两层的树。
更新
假设你的数组结构代表一棵树:每个“级别”代表树的一个级别,数组中同一级别的对象在数组中的同一级别,使用递归的可能解决方案可以是:
var tree = [{
'text': 'A',
'children': [{
'text': 'A.1',
'children': [{
'text': 'A.1.1',
'children': [{
'text': 'A.1.1.1',
'children': [{
'text': 'A.1.1.1.1'
}]
}, {
'text': 'A.1.1.1',
'children': [{
'text': 'A.1.1.1.2'
}]
}]
}]
}, {
'text': 'A.2',
'children': [{
'text': 'A.2.1',
'children': [{
'text': 'A.2.1.1',
'children': []
}]
}]
}]
}, {
'text': 'B',
'children': []
}, {
'text': 'C',
'children': []
}, {
'text': 'A',
'children': [{
'text': 'A.3',
'children': []
}, {
'text': 'A.4',
'children': []
}]
}];
function joinChildren(childrenArray) {
return _.reduce(childrenArray, function(memo, o) {
var already = _.find(memo, function(o1) {
return o.text === o1.text;
});
return already ? (already.children = already.children.concat(o.children), memo) : memo.concat(o);
}, []);
}
function joinChildrenRecursively(rootArray) {
rootArray = joinChildren(rootArray);
_.forEach(rootArray, obj => {
if (_.isArray(obj.children)) {
obj.children = joinChildrenRecursively(obj.children);
}
});
return rootArray;
}
console.log(joinChildrenRecursively(tree));
<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>
希望对您有所帮助。
关于javascript - Lodash重新分配对象数组以构建树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40112854/