JavaScript对象的动态深度设置

Ale*_*lex 23 javascript object

给定对象属性路径的字符串,如何动态设置此属性.

给定此示例对象:

var obj = {
    a: {
        b: [ { c: 'Before' } ]
    }
};
Run Code Online (Sandbox Code Playgroud)

它应该能够使用这样的辅助函数设置值:

setToValue(obj, 'After', 'a.b.0.c');
Run Code Online (Sandbox Code Playgroud)

我用以下代码尝试了它.但如果变量不是引用,则父级是副本.

function setToValue(obj, value, path) {
    var arrPath = path.split('.'),
        parent = obj;

    for (var i = 0, max = arrPath.length; i < max; i++) {
        parent = parent[arrPath[i]];
    }

    parent = value;
}
Run Code Online (Sandbox Code Playgroud)

Tig*_*ine 33

a)简单的ab [0] .c ='之后'有什么问题?

至于方法:

function setToValue(obj, value, path) {
    var i;
    path = path.split('.');
    for (i = 0; i < path.length - 1; i++)
        obj = obj[path[i]];

    obj[path[i]] = value;
}
Run Code Online (Sandbox Code Playgroud)

这里的JSFiddle:http://jsfiddle.net/QycBz/24/


Die*_*itz 22

这是一个完整的解决方案.

如果对象不存在,也会创建对象.

function setValue(obj, path, value) {
  var a = path.split('.')
  var o = obj
  while (a.length - 1) {
    var n = a.shift()
    if (!(n in o)) o[n] = {}
    o = o[n]
  }
  o[a[0]] = value
}

function getValue(obj, path) {
  path = path.replace(/\[(\w+)\]/g, '.$1')
  path = path.replace(/^\./, '')
  var a = path.split('.')
  var o = obj
  while (a.length) {
    var n = a.shift()
    if (!(n in o)) return
    o = o[n]
  }
  return o
}
Run Code Online (Sandbox Code Playgroud)