如何根据对象中的位置修改对象属性

时间:2016-09-02 20:45:09

标签: javascript object reflection pass-by-reference

给定一个对象obj,我可以使用obj.a.b.c = "new value"之类的东西来修改它的属性。但是,我希望能够以编程方式执行此操作,使用属性的位置以数组的形式。我怎样才能创建一个如下所示的函数:

modifyProperty(obj, ["a", "b", "c"], "new value");

并且相当于

obj.a.b.c = "new value";

3 个答案:

答案 0 :(得分:2)

如果没有可用的对象,您可以使用Array#reduce和默认对象。

function modifyProperty(object, path, value) {
    var last = path.pop();
    path.reduce(function (r, a) {
        if (!(a in r)) {
            r[a] = {};
        }
        return r[a];
    }, object)[last] = value;
}

var object = {};
modifyProperty(object, ["a", "b", "c"], "new value");
console.log(object);

答案 1 :(得分:1)

您可以这样做:



function modifyProperty(obj, props, val) {
    var propName = props.pop();
    var o = props.reduce(function(obj, p) {
        return obj[p];
    }, obj);
    o[propName] = val;
}

var obj = {
   a: {b: {c: "old value"}}
}

modifyProperty(obj, ["a", "b", "c"], "new value");

console.log(obj);




答案 2 :(得分:0)

为了动态设置对象值,我有一个名为Object.prototype.setNestedValue()的代码。这将使用一组项目来指定数组的属性,最后一个是值。如

Object.prototype.setNestedValue = function(...a) {
  a.length > 2 ? typeof this[a[0]] === "object" && this[a[0]] !== null ? this[a[0]].setNestedValue(...a.slice(1))
                                                                       : (this[a[0]] = typeof a[1] === "string" ? {} : new Array(a[1]),
                                                                         this[a[0]].setNestedValue(...a.slice(1)))
               : this[a[0]] = a[1];
  return this;
};

var obj = {}.setNestedValue("a","b","c",100);
console.log(JSON.stringify(obj,null,2));

如果使用整数代替字符串参数,则会得到一个数组,例如

Object.prototype.setNestedValue = function(...a) {
      a.length > 2 ? typeof this[a[0]] === "object" && this[a[0]] !== null ? this[a[0]].setNestedValue(...a.slice(1))
                                                                           : (this[a[0]] = typeof a[1] === "string" ? {} : new Array(a[1]),
                                                                             this[a[0]].setNestedValue(...a.slice(1)))
                   : this[a[0]] = a[1];
      return this;
    };

    var obj = {}.setNestedValue("a",2 ,3,100);
    console.log(JSON.stringify(obj,null,2));