是否可以在一行中将属性添加到添加属性的添加属性...
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不存在。但是有一个简单的单行程来做我想做的事情(即,即使嵌套对象中的某些级别还没有存在,也添加一个嵌套属性)?
答案 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_b
或prop_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);
答案 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的数组的属性而存在,并且它是完全可访问的。