在Javascript中动态访问数组

在Javascript中动态访问数组,javascript,arrays,Javascript,Arrays,也许已经有解决办法了,但我找不到。我尝试在多维数组中访问不同的插槽,但面临不同深度的挑战。基本上,它看起来是这样的: var source = []; source['lvl1'] = []; source['lvl1']['lvl2a'] = []; source['lvl1']['lvl2a']['lvl3'] = "ping"; source['lvl1']['lvl2b'] = "pong"; var path1 = ["lvl1","lvl2a","lvl3"]; var path2

也许已经有解决办法了,但我找不到。我尝试在多维数组中访问不同的插槽,但面临不同深度的挑战。基本上,它看起来是这样的:

var source = [];
source['lvl1'] = [];
source['lvl1']['lvl2a'] = [];
source['lvl1']['lvl2a']['lvl3'] = "ping";
source['lvl1']['lvl2b'] = "pong";
var path1 = ["lvl1","lvl2a","lvl3"];
var path2 = ["lvl1","lvl2b"];

console.log(source[path1[0]][path1[1]][path[2]]); // => ping
console.log(source[path2[0]][path2[1]]); // => pong
如果深度是固定的,我可以编写如下代码:

var source = [];
source['lvl1'] = [];
source['lvl1']['lvl2a'] = [];
source['lvl1']['lvl2a']['lvl3'] = "ping";
source['lvl1']['lvl2b'] = "pong";
var path1 = ["lvl1","lvl2a","lvl3"];
var path2 = ["lvl1","lvl2b"];

console.log(source[path1[0]][path1[1]][path[2]]); // => ping
console.log(source[path2[0]][path2[1]]); // => pong
我的问题是编写一个适用于这两种变体的代码。这将有助于:

switch(path.length)
{
  case 1:
    console.log(source[path[0]]);
    break;
  case 2: 
    console.log(source[path[0]][path[1]]);
    break;
  case 3:
    console.log(source[path[0]][path[1]][path[2]]);
    break;
}
但这既不高效也不优雅。有人有其他解决方案,例如与某种循环一起工作吗

谢谢
Thomas

如果您确定数组中的所有值都存在,那么您可以简单地使用,如下所示

console.log(path1.reduce(function(result, currentKey) {
    return result[currentKey];
}, source));
# ping
function getValueFromObject(object, path) {
    return path.reduce(function(result, currentKey) {
        return result[currentKey];
    }, object);
}
console.assert(getValueFromObject(source, path1) === "ping");
console.assert(getValueFromObject(source, path2) === "pong");
你可以把它变成通用的,像这样

console.log(path1.reduce(function(result, currentKey) {
    return result[currentKey];
}, source));
# ping
function getValueFromObject(object, path) {
    return path.reduce(function(result, currentKey) {
        return result[currentKey];
    }, object);
}
console.assert(getValueFromObject(source, path1) === "ping");
console.assert(getValueFromObject(source, path2) === "pong");
然后像这样调用它

console.log(path1.reduce(function(result, currentKey) {
    return result[currentKey];
}, source));
# ping
function getValueFromObject(object, path) {
    return path.reduce(function(result, currentKey) {
        return result[currentKey];
    }, object);
}
console.assert(getValueFromObject(source, path1) === "ping");
console.assert(getValueFromObject(source, path2) === "pong");
注意:您需要确保
源代码是JavaScript对象。您现在拥有的称为数组

var source = {};   # Note `{}`, not `[]`

您可以在记录源代码之前循环并建立它的值。试试这个:

var sourceValue = source[path[0]];
for (var i = 1; i < path.length; i++) {
    sourceValue = sourceValue[path[i]];
}
console.log(sourceValue);
var sourceValue=source[path[0]];
对于(变量i=1;i

下面是一个示例,演示了这种方法的工作原理。

您可以从路径(测试代码)中获得一个值:


OP需要一个对象。不是数组,因为他在用钥匙。@AmitJoki我不明白,什么不是数组?你能解释一下吗?我删除了我以前的评论,请刷新页面。@AmitJoki不,该评论仅用于第一条评论。当OP正在执行
var source=[]时;source[“key”]
,它倾向于使用数组。另外,我的第一条评论是在您将
源代码
编辑为对象之前发表的。请注意,您不是在使用数组,而是在向对象添加属性,javascript没有关联数组。现在还不清楚您在这里实际要做什么。最后,我尝试为json配置文件开发一个通用编辑器。我有一些模式文件taht描述json,然后我的脚本一方面创建一个html表单来编辑数据,另一方面将更改写回json结构。阅读并不困难,但是在结构中更新一个值是。嗯,我必须测试它。实际上,我的主要目的不仅仅是读取一个值(这种方法可以使用),而是设置一个新值。如果我是对的,您可以通过将原始对象减少到路径数组所描述的部分来提取值,但也可以销毁原始对象。如果您循环到
path.length-1
,则您将有一个对所需值的容器的引用,并可以对其进行修改。