Я не совсем уверен, что вы хотите, но при условии, что:
- Вы хотите вставить «groupNodes», а не обычные узлы, и чтобы у groupNodes могли быть неограниченные дочерние элементы.
- Исходное дерево содержит только обычные узлы, а не groupNodes.
- Все обычные узлы имеют идентификатор узла, условие, установленное в true или false, и массив childNodes.
- Вы не хотите создавать групповые узлы, которые не имеют дочерних элементов.
тогда вот ваш ответ.
function binize(tree) {
var left,right,t,u,
stack=[tree];
while(t=stack.pop()) {
left=[];
right=[];
while(u=t.childNodes.pop()) {
(u.condition?left:right).push(u);
stack.push(u);
}
left.length&&t.childNodes.push({
groupNodeId:left[0].nodeId,
condition:true,
childNodes:left
});
right.length&&t.childNodes.push({
groupNodeId:right[0].nodeId,
condition:false,
childNodes:right
});
}
}
Я протестировал его, используя эту структуру данных (обратите внимание, что дерево - это объект верхнего уровня, а не массив, содержащий его).
var tree={nodeId:'A',childNodes:[
{nodeId:'B',condition:true,childNodes:[]},
{nodeId:'C',condition:true,childNodes:[]},
{nodeId:'D',condition:false,childNodes:[
{nodeId:'F',condition:false,childNodes:[]},
{nodeIf:'G',condition:false,childNodes:[]}
]},
{nodeId:'E',condition:false,childNodes:[]}
]};
Если бы я знал немного больше о вашем дереве, то мог бы пойти другим путем. Например, если дерево не очень глубокое, то может быть более эффективно (и, конечно, чище) рекурсивно копаться в нем.
Кроме того, я никогда раньше не использовал KnockoutJS и не знаю, какие структуры ему нравятся. Я просто создал структуры, которые вы указали; надеюсь, это сработает.