如何解决如何编译嵌套层次结构中的所有后代
我很难概念化如何最好地编制一系列父母的后代列表。我有一个看起来像这样的层次结构,但树可能会变得更复杂:
[
{parent: 'e',children: ['f']},{parent: 'b',children: ['c','d']},{parent: 'd',children: ['e']},{parent: 'a',children: ['b']},{parent: 'c',children: ['d]'}
]
我想要这样的输出:
[
{parent: 'e','d','e','f']},children: ['e',children: ['b','c',children: ['d',]
理想情况下,答案不会使用任何现代 javascript,因为我是用 1999 年基于 ECMA-262 的扩展脚本编写的。是的,我知道这很痛苦,所以我会尽我所能,我会做到的工作。
编辑:正如 bergi 所注意到的,循环引用是允许的。因此,a
可以是 b
的子代,b
可以是 a
的子代,因为它们可以修改彼此的不同属性。
解决方法
好吧...抱歉,它看起来很神秘,几乎像 COBOL,但它有效(我希望):
// data -------------------------------------------------------------
var array =[
{parent: 'e',children: ['f']},{parent: 'b',children: ['c','d']},{parent: 'd',children: ['e']},{parent: 'a',children: ['b']},{parent: 'c',children: ['d']}
]
// main -------------------------------------------------------------
var obj = array_to_obj(array);
while(obj.toSource() != spread_children(obj).toSource())
// repeat the function until there aren't changes in the obj anymore
obj = spread_children(obj);
array = obj_to_array(obj); // <-- result is here
// output,just to be sure
var msg = "\n[\n"
for (var i in array)
msg += " " + array[i].toSource().slice(1,-1) + ",\n";
alert(msg+"]");
// functions --------------------------------------------------------
function array_to_obj(array) { // [{a:[]},{b:[]}] --> {a:{},b:{}}
var obj = {};
for (var i in array) {
var key = array[i].parent;
var value = children_to_objects(array[i].children);
obj[key] = value;
}
return obj;
function children_to_objects(array) { // [a,b,c] --> {a:'a',b:'b',c:'c'}
var obj = {};
for (var i in array) obj[array[i]] = array[i];
return obj;
}
}
function spread_children(obj) { // a little bit cryptic...
for (var key in obj) { // for all keys of the obj
for (var value in obj[key]) { // for all values of the key
if (obj[value]) { // if obj[value] (parent) exists:
// add all keys of the obj[value] to obj[key]
for (var v in obj[value]) obj[key][v] = v;
// and since object can't have identical keys
// there will never be duplicates
}
}
}
return obj;
}
function obj_to_array(obj) { // {a:{},b:{}} --> [{a:[]},{b:[]}]
var array=[];
for (var parent in obj) {
var children = [];
for (var child in obj[parent]) children.push(child);
array.push({'parent': parent,'children': children});
}
return array;
}
输出:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。