一尘不染

以点表示法转换字符串以获取对象引用

javascript

考虑一下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 } }

阅读 235

收藏
2020-04-25

共1个答案

一尘不染

要获得该值,请考虑:

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上面给定的方法获取对包含对象的引用,然后将[]运算符应用于该对象:

parts = str.split(/\.(?=[^.]+$)/)  // Split "foo.bar.baz" into ["foo.bar", "baz"]
ref(obj, parts[0])[parts[1]] = 99
2020-04-25