node.js从字符串属性名称设置属性

时间:2014-10-20 13:54:01

标签: javascript node.js object

我试图创建一个能够设置某个对象值的函数,具有该属性的“路径”:

reflectionSet = function(obj, propString, value) {
    var current = obj;
    var splitted = propString.split('.');
    splitted.forEach(function(k) {
        current = current[k];
    })
    current = value;
}
var test = {
    a: {
        s: 'asd',
        g: 'asasdasdd'
    }
};

reflectionSet(test, 'a.g', "otherValue");

它应该成为:

{
    a: {
        s: 'asd',
        g: 'otherValue'
    }
}

不幸的是,这根本不起作用..谢谢

2 个答案:

答案 0 :(得分:1)

您可以使用基于.拆分属性,然后使用Array.prototype.reduce,转到对象的最内部并按此更新

function reflectionSet(obj, propString, value) {
    return propString.split(".").reduce(function(result, part, index, array) {
        if (index === array.length - 1) {
            result[part] = value;
            return obj;
        }
        return result[part];
    }, obj);
}

var test = {
    a: {
        s: 'asd',
        g: 'asasdasdd'
    }
};

console.log(reflectionSet(test, 'a.g', "otherValue"));

<强>输出

{
    a: {
        s: 'asd',
        g: 'otherValue'
    }
}

答案 1 :(得分:1)

你的功能的这个更正版本应该这样做。

reflectionSet = function(obj, prop, value) {
    prop = prop.split('.');
    var root = obj, i;
    for(i=0; i<prop.length; i++) {
        if(typeof root[prop[i]] == 'undefined') root[prop[i]] = {};
        if(i === prop.length - 1) root[prop[i]] = value;
        root = root[prop[i]];
    }
    return obj;
};

现在:

var test = { a: { s: 'asd', g: 'asasdasdd' } };
reflectionSet(test, 'a.g', "otherValue");

将返回{ a: { s: 'asd', g: 'otherValue' } }