可变长度javascript表访问

可变长度javascript表访问,javascript,Javascript,假设我有以下几点: strA = "/ItemA/Item1/Item2/" dataA = "A Data" strB = "/ItemA/Item1/Item2/Item3/" dataB = "B Data" table = { "ItemA" : { "Item1" : { "Item2": { "Item3" : { ... } } }

假设我有以下几点:

strA = "/ItemA/Item1/Item2/"
dataA = "A Data"

strB = "/ItemA/Item1/Item2/Item3/"
dataB = "B Data"

table = { "ItemA" : { 
            "Item1" : { 
              "Item2": { 
                "Item3" : { ... }
              }
            }
          }
        }
该字符串包含表中的项目(即子表键),然后需要将附带的数据存储在其中

假设我可以有一个长度可变的字符串(即可以一直到“Item7”),有没有一种简单的方法来访问该表

迭代循环不起作用(我认为):

stringPartsA=strA.split(“/”)//[“ItemA”、“Item1”、“Item2”](假设我也删除了“”)
对于(var i=0;i
我搜索了一下,找不到类似的问题,想知道是否有解决方案(不修改字符串或表的结构…)


谢谢

我认为您的迭代解决方案大部分都在那里

stringPartsA = strA.split("/");
var currentLevel = table; 
for (var i = 0; i < stringPartsA.length; i++){
   var token = stringPartsA[i];
   if (!token) continue; // handle leading or trailing slashes
   currentLevel = currentLevel[token];
}
return currentLevel;
stringPartsA=strA.split(“/”);
var currentLevel=表格;
对于(var i=0;i

这就是你想要的吗?

我认为你的迭代解大部分都在那里

stringPartsA = strA.split("/");
var currentLevel = table; 
for (var i = 0; i < stringPartsA.length; i++){
   var token = stringPartsA[i];
   if (!token) continue; // handle leading or trailing slashes
   currentLevel = currentLevel[token];
}
return currentLevel;
stringPartsA=strA.split(“/”);
var currentLevel=表格;
对于(var i=0;i

这就是你想要的吗?

你想要的是:

var out = table;
strA.split("/").filter(function(el) {
    return el !== "";
}).forEach(function(el) {
    out = out[el];
});
//out now stores the object you want
说明:

  • split
    将字符串拆分为按“/”字符拆分的字符串数组
  • filter
    过滤掉所述数组开头和结尾的空字符串
  • forEach
    循环经过过滤的数组,并在每个循环处进行更改,以进一步导航到
    对象

    • 您想要的是:

      var out = table;
      strA.split("/").filter(function(el) {
          return el !== "";
      }).forEach(function(el) {
          out = out[el];
      });
      //out now stores the object you want
      
      说明:

      • split
        将字符串拆分为按“/”字符拆分的字符串数组
      • filter
        过滤掉所述数组开头和结尾的空字符串
      • forEach
        循环经过过滤的数组,并在每个循环处进行更改,以进一步导航到
        对象

      • ShaneQful的答案很好,但可以进一步简化。代码更少,没有状态

        var result = path.split('/').reduce(function (result, key) {
            return key ? result[key] : result;
        }, table);
        

        注:可以使用破折号或下划线代替本机字母。

        ShaneQful的答案很好,但可以进一步简化。代码更少,没有状态

        var result = path.split('/').reduce(function (result, key) {
            return key ? result[key] : result;
        }, table);
        

        注意:可以使用短划线或下划线代替本机文字。

        感谢未解释的下一票,酷酷匿名SOer。感谢未解释的下一票,酷酷匿名SOer。回答得好!我没有考虑只存储一个指向表中我想要的位置的引用,这很有意义!回答得好!我没有考虑只存储一个指向表中我想要的位置的引用,这很有意义!尼克,回答得好!我认为你和Shane的答案非常相似,但看起来Shane比你快了一分钟——无论如何,谢谢!尼克,回答得好!我认为你和Shane的答案非常相似,但看起来Shane比你快了一分钟——无论如何,谢谢!谢谢你的回答!此外,我还没有太多地研究过虚线或下划线。。。有趣的(而且似乎非常有用)库。还有,你说没有州是什么意思?请原谅我的无知……我的意思是,没有外部变量(
        out
        在ShaneQful的答案中)暴露算法的当前状态。我提议的版本是无状态的。状态通常是你想要避免的事情(参见)。明白-这是一个很好的答案!修改我的代码以使用此。。。谢谢雨果!谢谢你的回答!此外,我还没有太多地研究过虚线或下划线。。。有趣的(而且似乎非常有用)库。还有,你说没有州是什么意思?请原谅我的无知……我的意思是,没有外部变量(
        out
        在ShaneQful的答案中)暴露算法的当前状态。我提议的版本是无状态的。状态通常是你想要避免的事情(参见)。明白-这是一个很好的答案!修改我的代码以使用此。。。谢谢雨果!