2

这个问题与我正在尝试做的事情有点相反。基本上,我有这个对象:

var a = {
    b: {
        c: 'Foo'
    }
}

我需要做的是在给定字符串'bc'的情况下设置c的值。不幸的是,我不能这样做:

a['b.c'] = 'Bar'

据我所知,上面的问题并没有让我很接近,因为它只是复制对象属性的值以便可以读取它们。但是,它并不能帮助我设置对象属性的值。这是我到目前为止所拥有的:

var key = 'b.c'.split('.');

for (var i = 0; i < key.length; i++) {
    // do something
}
4

3 回答 3

3

这是一种功能方式,这是您需要的吗?它不使用特定的a[string]语法,而是一个函数,您可以在其中传递对象字符串和要设置的值:

var obj = { foo: { bar: { lol: { lulz: 69 } } } };

function setProp(obj, prop, value) {
  var props = prop.split('.');
  return [obj].concat(props).reduce(function(a,b,i) {
    return i == props.length ? a[b] = value : a[b];
  });
}

setProp(obj, 'foo.bar.lol.lulz', 'hello world');

console.log(obj.foo.bar.lol.lulz); //=> "hello world"
于 2013-06-13T04:21:44.877 回答
1

您必须拦截循环的最后一次迭代,并从那里分配而不是重新定义您的临时变量。

我调整了您链接的问题的答案,以将值分配2a.b.c

var a = {
  "b" : {
    "c" : 1
  }
}

var n = "b.c".split(".");
var x = a;
for(var i = 0; i < n.length; i++){
    if(i == n.length-1) {
        x[n[i]] = 2;
    } else {
        x = x[n[i]];
    }
}

http://jsfiddle.net/Fuhbb/


这几乎就是@Ian 在他的 jsfiddle 中所做的事情。而不是 an if,他循环少了一步,然后在循环之后处理分配。

于 2013-06-13T04:08:33.380 回答
0

为了记录,我最终想出了另一种方法来做到这一点:

function setProperty(obj, props, val) {
    if (obj[props[0]] instanceof Object) {
        setProperty(obj[props[0]], props.slice(1, props.length), val);

        return;
    }

    obj[props[0]] = val;
}

像这样称呼它:

a = {
    b: {
        c: 'Foo'
    }
};

var whatever = 'b.c';

var props = whatever.split('.');

setProperty(a, props, 'Bar');
于 2013-06-20T20:47:28.810 回答