很抱歉我的最后一个问题太令人困惑了,我很困惑,但现在我得到了一个合适的例子:
var obj = {};
obj.entities = [];
obj.entities["player"] = [];
obj.entities["player"]["0"] = [];
obj.entities["player"]["0"]["pos"] = "0,0";
var jsonStr = JSON.stringify(jsonObj);
// {"entities":[]}
console.log(JSON.stringify(obj));
正如您所看到的,JSON.stringify(obj)
的输出是错误的。是什么原因造成的?
首先构建一个数组([]
),然后用非数字键(player
)为其分配属性。这在技术上是可能的(比如不会导致错误),但这不是数组的用途。
您应该使用对象({}
)。此外,["player"]
与.player
相同。
var obj = {};
obj.entities = {};
obj.entities.player = []; // array here because you're filling with indices ([0])
obj.entities.player[0] = {}; // object again, because non-indices as keys (`pos`)
obj.entities.player[0].pos = "0,0";
对象可以采用任何属性键。数组是对象的一个子集,应该只将索引(数字>= 0
)作为键。
如果你用JSON定义你的对象,你的生活会轻松得多:
var obj = {
'entities': [
{'player':{'pos': '0,0'}}
]
};
您使用的是命名数组索引,而不是对象键/值对。
var obj = {};
obj.entities = {};
obj.entities["player"] = {};
obj.entities["player"]["0"] = [];
obj.entities["player"]["pos"] = "0,0";
// {"entities":{"player":{"0":[],"pos":"0,0"}}}
console.log(JSON.stringify(obj));
entities
、entities["player"]
和entities["player"]["0"]
需要是对象,而不是数组。
您正在向这些数组添加属性,而不是将值推送到它们上。这些自定义属性没有字符串化。
修复方法很简单:
var obj = {};
obj.entities = {}; // <------------ this is an object now
obj.entities["player"] = {}; // <--------- also an object
obj.entities["player"]["0"] = {}; // <-------- and so on
obj.entities["player"]["0"]["pos"] = "0,0";
我认为您对javascript中的数组和对象有一些严重的混淆。数组([]
)仅适用于正整数索引。在您的示例中,您正在执行以下操作:
obj.entities = [];
obj.entities["player"] = [];
您说obj.entities
是一个数组,然后使用player
作为索引。并且player
不是整数。所以这个代码毫无意义。另一方面,您可以使用具有属性的对象。这些属性可以是字符串:
obj.entities = {};
obj.entities.player = [];
obj.entities.player[0] = 'foo bar';
您混淆了对象和数组。以下代码将起作用。
var obj = {};
obj.entities = {};
obj.entities.player = [];
obj.entities.player[0] = {};
obj.entities.player[0].pos = "0,0";
你做错了什么:
- 数组只能有整数索引。因此,如果您打算将
a
用作数组,那么编写["1"]是不正确的 - 为了正确序列化,只有对象才能具有命名属性,如
object.entities.player
或object.entities["player"]