我想我已经看过如何在没有事先准备的情况下创建JSON对象。这就是我准备它的方式:
obj = {
0:{
type:{}
},
1:{},
2:{}
};
现在我想我可以插入一个类似obj.0.type = "type0";
的值但是我想在使用它时创建它:obj['0']['type'] = "Type0";
。
有可能,还是我需要准备它?我想在飞行中创造它"!
修改
我想创建JS对象"动态"。
var obj = {};
obj.test = "test"; //One "layer" works fine.
obj.test.test = "test" //Two "layers" do not work... why?
答案 0 :(得分:1)
obj = {
0:{
type:{}
},
1:{},
2:{}
};
现在我认为我可以插入如下值:obj.0.type =" type0&#34 ;;
我猜你的意思是"分配"一个值,而不是"插入"。无论如何,不,你不能,至少不是这样,因为obj.0
是无效的语法。
但是我想在使用它时创建它:obj [' 0'] [' type'] =" Type0&#34 ;;
没关系。但您需要了解自己覆盖 obj[0][type]
的现有值,这是一个空对象({}
),字符串为Type0
。换句话说,不需要为诸如type
之类的属性提供初始化值以便为其分配。所以以下内容同样有效:
obj = {
0:{},
1:{},
2:{}
};
现在让我们考虑你的第二个案例:
var obj = {};
obj.test = "test"; //One "layer" works fine.
obj.test.test = "test" //Two "layers" do not work... why?
仔细思考发生了什么。您正在创建一个空的obj
。您可以分配该对象上的任何属性,而无需初始化该属性。这就是obj.test
作业的原因。然后在第二个作业中,您尝试设置test
的{{1}}属性,您将其设置为字符串obj.test
。实际上,这将起作用 - 因为字符串是可以设置属性的对象。但那可能不是你想要做的。您可能想要说明前一个字符串值"test"
将由具有自己的属性obj.test
的对象替换。要做到这一点,你可以说
"test"
或者
obj.test = { test: "test" };
答案 1 :(得分:0)
您正在JavaScript中创建一个普通对象,您需要在使用它之前定义任何内部属性。
因此,如果您要在对象"Type0"
的属性type
内设置0
属性obj
,则不能 :
obj['0']['type'] = "Type0";
您收到“参考错误”。您需要在使用之前初始化对象:
var obj = {
0: {
type: ""
}
};
obj['0']['type'] = "Type0";
console.log(obj['0']['type']);
答案 2 :(得分:0)
您可以创建自己的函数,将key
作为字符串和value
并创建并返回嵌套对象。我使用.
作为对象键的分隔符。
function create(key, value) {
var obj = {};
var ar = key.split('.');
ar.reduce(function(a, b, i) {
return (i != (ar.length - 1)) ? a[b] = {} : a[b] = value
}, obj)
return obj;
}
console.log(create('0.type', 'type0'))
console.log(create('lorem.ipsum.123', 'someValue'))
答案 3 :(得分:0)
是否有必要在使用之前创建嵌套对象?
是,至少父对象必须存在。
示例:
var object = {};
// need to assign object[0]['prop'] = 42;
使用默认
创建第一个属性object[0] = object[0] || {};
然后分配值
object[0]['prop'] = 42;
var object = {};
object[0] = object[0] || {};
object[0]['prop'] = 42;
console.log(object);

使用属性名称作为数组创建对象
function setValue(object, keys, value) {
var last = keys.pop();
keys.reduce(function (o, k) {
return o[k] = o[k] || {};
}, object)[last] = value;
}
var object = {};
setValue(object, [0, 'prop'], 42);
console.log(object);