考虑一下javascript中的此对象,
var obj = { a : { b: 1, c: 2 } };
给定字符串“ obj.ab”,如何获取该对象所指向的对象,以便可以更改其值?即我希望能够做类似的事情
obj.a.b = 5; obj.a.c = 10;
其中“ obj.ab”和“obj.ac”是字符串(不是obj引用)。我碰到了,在这里我可以得到点符号字符串指向obj的值,但我需要的是一种可以获取对象本身的方法?
对象的嵌套可能比这更深。即也许
var obj = { a: { b: 1, c : { d : 3, e : 4}, f: 5 } }
要获得该值,请考虑:
function ref(obj, str) { str = str.split("."); for (var i = 0; i < str.length; i++) obj = obj[str[i]]; return obj; } var obj = { a: { b: 1, c : { d : 3, e : 4}, f: 5 } } str = 'a.c.d' ref(obj, str) // 3
或更花哨的方式,使用reduce:
function ref(obj, str) { return str.split(".").reduce(function(o, x) { return o[x] }, obj); }
在javascript中无法返回对对象成员的可分配引用,您必须使用如下函数:
function set(obj, str, val) { str = str.split("."); while (str.length > 1) obj = obj[str.shift()]; return obj[str.shift()] = val; } var obj = { a: { b: 1, c : { d : 3, e : 4}, f: 5 } } str = 'a.c.d' set(obj, str, 99) console.log(obj.a.c.d) // 99
或使用ref上面给定的方法获取对包含对象的引用,然后将[]运算符应用于该对象:
ref
[]
parts = str.split(/\.(?=[^.]+$)/) // Split "foo.bar.baz" into ["foo.bar", "baz"] ref(obj, parts[0])[parts[1]] = 99