将属性链添加到JS Object

时间:2016-05-26 21:12:42

标签: javascript object

是否可以在一行中将属性添加到添加属性的添加属性...

var some_object = {};
some_object.prop_a = "hi";
some_object.prop_b.prop_c.prop_d = "ho";

虽然第2行显然有效,但第3行没有,因为它返回cannot read property of undefined错误。我知道,当prop_d应该被分配时,prop_b和prop_c不存在。但是有一个简单的单行程来做我想做的事情(即,即使嵌套对象中的某些级别还没有存在,也添加一个嵌套属性)?

4 个答案:

答案 0 :(得分:4)

你当然可以写一个函数来做到这一点。也许是这样的事情:

ax1.axis([xmin, xmax, pos, pos+2])

答案 1 :(得分:3)

  

我知道,当prop_d应该被分配时,prop_b和prop_c不存在。

如果是这种情况,您可以这样做:

some_object.prop_b = {
  prop_c : {
    prop_d : "ho"
  }
};

(或者,在一行中:)

some_object.prop_b = { prop_c : { prop_d : "ho" } };

您只是使用JavaScript的object initializer syntax来创建嵌套对象。

但是,请注意,如果这些值已存在,则会覆盖任何现有的prop_bprop_b.prop_c值。

答案 2 :(得分:0)

您可以在分配之前调用方法以确保插槽是对象。缺点是您已将路径作为字符串提供。你必须走链子。

function ensurePropertyOnObject(o, m)
{
    var props = m.split('.');
    var item;
    var current = o;

    while(item = props.shift()) {
        if(typeof o[item] != 'object') {
            current[item] = {};
        }
        current = o[item];
    }    
}

ensurePropertyOnObject(some_object, "prop_b.prop_c.prop_d");
some_object.prop_b.prop_c.prop_d = "ho";
console.log(some_object);

查看示例:https://jsfiddle.net/ho4k02fr/

答案 3 :(得分:0)

为了动态访问和设置对象属性,我发明了两个名为Object.prototype.setNestedValue()Object.prototype.getNestedValue()的Object方法,其中您将嵌套属性作为参数提供。对于Object.prototype.setNestedValue(),最后一个参数是在末尾设置的值。就是这样;

Object.prototype.getNestedValue = function(...a) {
  return a.length > 1 ? (this[a[0]] !== void 0 && this[a[0]].getNestedValue(...a.slice(1))) : this[a[0]];
};

Object.prototype.setNestedValue = function(...a) {
  return 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];
};

var some_object = {};
some_object.prop_a = "hi";
some_object.setNestedValue("prop_b","prop_c","prop_d","ho");
console.log(JSON.stringify(some_object,null,2));

您还可以添加数组对象。为此,您必须输入数字类型的索引。让我们举个例子......

Object.prototype.getNestedValue = function(...a) {
  return a.length > 1 ? (this[a[0]] !== void 0 && this[a[0]].getNestedValue(...a.slice(1))) : this[a[0]];
};

Object.prototype.setNestedValue = function(...a) {
  return 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];
};

var some_object = {};
some_object.prop_a = "hi";
some_object.setNestedValue("prop_b",3,"prop_d","yay");
some_object.setNestedValue("prop_b",0,"prop_d","zero this is");
some_object.setNestedValue("prop_b",1,"prop_d","i am the one");
some_object.setNestedValue("prop_b","prop_c","prop_d","ho");
console.log(JSON.stringify(some_object,null,2));

您会注意到prop_c未登记但仍然作为分配给prob_b的数组的属性而存在,并且它是完全可访问的。