通过数组(或任何)格式的路径修改多维数组中的值

时间:2015-04-17 15:13:51

标签: javascript angularjs multidimensional-array

我有一个多维数组,表示可能无限深的类别树菜单,看起来像这个

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:我不能递归地遍历路径数组并逐个节点地到达正确的树,因为没有通过引用传递,每次我将一个子节点分配给变量时,我得到一个副本(但我需要改变原来的。)

感谢您的时间。

2 个答案:

答案 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"