如何在JavaScript中设置其字符串名称的对象属性(对象属性为...)?

Chi*_*nke 46 javascript string nested properties

假设我们只被给予

var obj = {};
var propName = "foo.bar.foobar";
Run Code Online (Sandbox Code Playgroud)

我们如何将属性obj.foo.bar.foobar设置为某个值(比如"hello world")?所以我想实现这一点,而我们只在字符串中有属性名称:

obj.foo.bar.foobar = "hello world";
Run Code Online (Sandbox Code Playgroud)

Vis*_*ioN 76

function assign(obj, prop, value) {
    if (typeof prop === "string")
        prop = prop.split(".");

    if (prop.length > 1) {
        var e = prop.shift();
        assign(obj[e] =
                 Object.prototype.toString.call(obj[e]) === "[object Object]"
                 ? obj[e]
                 : {},
               prop,
               value);
    } else
        obj[prop[0]] = value;
}

var obj = {},
    propName = "foo.bar.foobar";

assign(obj, propName, "Value");
Run Code Online (Sandbox Code Playgroud)


Cer*_*rus 12

由于这个问题似乎是由不正确的答案回答的,我只是从类似的问题中引用正确的答案

function setDeepValue(obj, value, path) {
    if (typeof path === "string") {
        var path = path.split('.');
    }

    if(path.length > 1){
        var p=path.shift();
        if(obj[p]==null || typeof obj[p]!== 'object'){
             obj[p] = {};
        }
        setDeepValue(obj[p], value, path);
    }else{
        obj[path[0]] = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用:

var obj = {};
setDeepValue(obj, 'Hello World', 'foo.bar.foobar');
Run Code Online (Sandbox Code Playgroud)

  • 嗯.你的答案看起来像我的精确副本:) (2认同)

小智 12

我知道这是一个旧的,但我在答案中只看到自定义函数。
如果您不介意使用库,请查看lodash _.set_.get函数。


Ste*_*ann 5

编辑:我创建了一个jsPerf.com 测试用例来将接受的答案与我的版本进行比较。事实证明,我的版本更快,尤其是当你深入时。

http://jsfiddle.net/9YMm8/

var nestedObjectAssignmentFor = function(obj, propString, value) {
    var propNames = propString.split('.'),
        propLength = propNames.length-1,
        tmpObj = obj;

    for (var i = 0; i <= propLength ; i++) {
        tmpObj = tmpObj[propNames[i]] = i !== propLength ?  {} : value;  
    }
    return obj;
}

var obj = nestedObjectAssignment({},"foo.bar.foobar","hello world");
Run Code Online (Sandbox Code Playgroud)

?

?