我有一个多维数组,表示可能无限深的类别树菜单,看起来像这个
this.tree = [{
"title": "1. dragon-breath",
"items": []
}, {
"title": "2. moiré-vision",
"items": [{
"title": "2.1. tofu-animation",
"items": [{
"title": "2.1.1. spooky-giraffe",
"items": []
}, {
"title": "2.1.2. bubble-burst",
"items": []
}],
}, {
"title": "2.2. barehand-atomsplitting",
"items": []
}],
}, {
"title": "3. unicorn-zapper",
"items": []
}, {
"title": "4. romantic-transclusion",
"items": []
}];
然后我有一个树叶的数组路径,它会在时间上动态变化,看起来像这样
var path = [0]
下次它看起来像这样
var path = [1][1]
或者
var path = [1][0][1]
现在我需要更改此路径所代表的离开的title属性。我找不到任何体面的方法来做到这一点。我想到的唯一的事情是eval功能,
eval('tree'+getStringPathByArrayPath([1,0,1])+'.name = "'+updatedName+'"')
我觉得有点邪恶,我也使用这个函数作为角度ng-model(getter / setter)所以我不希望浏览器一遍又一遍地评估它。
有什么好的方法可以解决这个问题,还是我对这个问题采取了不好的方法?
PS:我不能递归地遍历路径数组并逐个节点地到达正确的树,因为没有通过引用传递,每次我将一个子节点分配给变量时,我得到一个副本(但我需要改变原来的。)感谢您的时间。
答案 0 :(得分:1)
虽然Javascript是按值传递,但持有对象的任何变量的值都是对该对象的引用。传递这样的变量将传递引用,而不是对象的副本。所以这会改变你的树:
var node = this.tree[path[0]];
for (var i = 1 ; i < path.length ; i++) {
node = node.items[path[i]];
}
node.title = updatedName;
答案 1 :(得分:0)
假设您有 Array 定义要访问的属性以获得所需的值;
var path = [1, 0, 1];
// x y z
您还有一些相应的对象
var obj = [
// y 0 1 // x
// z 0 1 0 1 //
[['a', 'b'], ['c', 'd']], // 0
[['e', 'f'], ['g', 'h']] // 1
];
您可以编写一个函数来获取值
function followPath(root, path) {
var i;
for (i = 0; i < path.length; ++i)
root = root[path[i]];
return root;
}
在这个例子中你得到了
followPath(obj, path); // "f"