【问题标题】:javascript: access object (array) by array notation stringjavascript:通过数组表示法字符串访问对象(数组)
【发布时间】:2013-05-15 11:38:07
【问题描述】:

我想访问对象,前提是它的字符串路径以数组的形式是已知的。

1.) 有一个对象,其中

root["obj1"]["obj2"] = 1;

(一般情况下root["obj1"]...["objN"]

2.) 我只知道字符串 objectPath:

var objectPath = 'root["obj1"]["obj2"]'

3.) 我不仅需要读取对象,还需要设置它的值,例如

objectPath = 2;
//so root["obj1"]["obj2"] === 2

据我了解

  1. eval() 可能有一些选项,但它获取的是值,而不是变量;

  2. 1234563等于循环中的当前对象。

http://jsfiddle.net/ACsPn/

相关链接: Access object child properties using a dot notation string

【问题讨论】:

  • 是的,使用 eval(),我需要重置对象,例如将 1 更改为 2。
  • 您链接到的问题中接受的答案比 eval 好得多。它几乎包含了您需要的所有内容,您只需使用不同的拆分并将其更改为 set(path,value) 函数。
  • 一个字符“。”针对两个字符“[”“]”已经是一些解析器方法,我相信我们可以做得更好?
  • 毕竟要做好这样的功能并不容易,所以我写了一个。见答案。

标签: javascript jquery arrays object hierarchy


【解决方案1】:

我为你写了一个函数,试图让它尽可能漂亮和可重用:

function setProp(path, newValue, holder) {
    var t = path.split(/[\[\]"]+/).filter(function(v){return v}),
        l = t.pop(), s, o = holder || window;
    while (s = t.shift()) o = o[s];
    o[l] = newValue;
}

你这样使用它:

setProp('root["obj1"]["obj2"]', 2);

如果您的根对象不在全局变量中,请将相关持有者作为第三个参数传递。

Demonstration (open the console to see the changed root object)

【讨论】:

  • 好的,感谢巧妙的拆分!我自己做不到。您能否解释一下 split 和 filter 的作用。 PS:变量s;而(s = t.shift)...?
  • 过滤器只是在这里确保拆分后数组的一端没有空值。 shift 从数组中删除第一个元素并返回它,当= 返回赋值时,循环在shift 什么都不返回时结束(即数组为空)。
  • (/[[]"]+/)
  • 是的,我忘记了 s 上的 var。我会添加它。 /[\[\]"]+/ 部分是匹配任何非空字符集[]" 的正则表达式。
  • 又要去读一本关于正则表达式的书了:)祝你有美好的一天!
猜你喜欢
  • 2015-03-24
  • 2011-09-23
  • 1970-01-01
相关资源
最近更新 更多