Kendo ui 在使用剑道树状视图时,是否有一种基于ID或文本合并多个节点的方法?
我有3个不同的对象/节点,如下所示,我正在尝试形成finalObj/节点,它是3个节点的并集(唯一树列表) 在树状视图中是否有一种方法可以根据文本或id合并3个对象(节点)Kendo ui 在使用剑道树状视图时,是否有一种基于ID或文本合并多个节点的方法?,kendo-ui,kendo-treeview,Kendo Ui,Kendo Treeview,我有3个不同的对象/节点,如下所示,我正在尝试形成finalObj/节点,它是3个节点的并集(唯一树列表) 在树状视图中是否有一种方法可以根据文本或id合并3个对象(节点) First node: [ { text: "TreeRoot", items: [ { text: "Subgroup1" }, { text: "Subgroup2" }
First node:
[ { text: "TreeRoot", items: [
{ text: "Subgroup1" },
{ text: "Subgroup2" }
]}]
Second Node:
[ { text: "TreeRoot", items: [
{ text: "Subgroup3" }
]}]
Third node:
[{ text: "Subgroup3",
items: [ {
text: "subgroup5",
items: [ {
text: "subgroup6",
items: [ {
text: "subgroup7",
items: [ {
text: "subgroup8"
}]
}] }]
}]}]
Final expected node (after merging):
var finalObj= [ { text: "TreeRoot", items: [
{ text: "Subgroup1" },
{ text: "Subgroup2" },
{ text: "Subgroup3",
items: [ {
text: "subgroup5",
items: [ {
text: "subgroup6",
items: [ {
text: "subgroup7",
items: [ {
text: "subgroup8"
}]
}] }]
}]}]}]
编辑:
以下解决方案不适用于其他类型的节点
例如:
var node1 = [
{ text : "TreeRoot",
id:0,
items: [
{ text: "Subgroup1",id:1 },
{ text: "Subgroup2", id:2}
]
}
];
var node2 = [
{
text : "TreeRoot",
id:0,
items: [
{ text: "Subgroup3" ,
id:3}
]
}
];
var node3 = [
{
text : "TreeRoot",
id:0,
items: [
{
text : "Subgroup2",
id:2,
items: [
{
text : "subgroup6",
id:6,
items: [
{
text : "subgroup7",
id:7,
items: [
{
text: "subgroup8",
id:8
}
]
}
]
}
]
}
]
}
];
对于上面的例子,我最初应该只看到树根。当展开时,我应该只看到子1,2,3。。。当子群2展开时,我应该可以看到子群6,7,8
我需要唯一的父节点和子节点。。如果我使用上面的结构,我会得到两个子节点,名为-subsub3,尽管您将其标记为剑道UI,但实际上这是一个编程问题,因为没有剑道接口来解决它(我知道您想使用它来合并
treeview
节点),但使用递归解决它并不困难
这基本上是您的三个节点:
var node1 = [
{ text : "TreeRoot",
items: [
{ text: "Subgroup1" },
{ text: "Subgroup2" }
]
}
];
var node2 = [
{
text : "TreeRoot",
items: [
{ text: "Subgroup3" }
]
}
];
var node3 = [
{
text : "Subgroup3",
items: [
{
text : "subgroup5",
items: [
{
text : "subgroup6",
items: [
{
text : "subgroup7",
items: [
{
text: "subgroup8"
}
]
}
]
}
]
}
]
}
];
可以使用以下函数将其合并:
function merge(node1, node2) {
if (node2 !== null) {
if (node1.text === node2.text) {
node1.items = node1.items || [];
$.each(node2.items, function (idx2, elem2) {
var found = false;
// Check that elem does not exist on node1
$.each(node1.items, function (idx1, elem1) {
if (!found && elem1.text === elem2.text) {
found = true;
merge(elem1, elem2);
}
});
if (!found) {
node1.items.push(elem2);
}
});
} else {
if (node1.items) {
$.each(node1.items, function (idx, item) {
merge(item, node2);
});
}
}
}
}
将两个节点合并到第一个节点中
你应该这样调用它:
merge(node1[0], node2[0]);
merge(node1[0], node3[0]);
对于您的场景
注意:我假设每个节点上只有一个元素(即node0
,node1
和node2
是数组,但它们只有一个元素)
看到它正在运行感谢您的解决方案。只要没有冗余的子节点,您的解决方案就可以正常工作。如果是一个冗余的子节点,这会将该子节点添加到一个新节点中,而不是忽略它(它基本上应该忽略这个节点,因为它已经存在于另一个父节点下)…但是,您是否了解这个想法,或者您需要帮助来解决这个特殊情况?答案是一个解决方案还是需要进一步完善?是的,我有一个想法,但我仍然困惑如何将子项附加到现有的父项,如果特定子项的父项已经存在…希望修复冗余节点的情况。检查一下。只需对
merge
函数稍加修改即可。