我有一个二维JSON数组,其中每个元素包含多个属性。以下示例有意简化:
var map_data = { "1":
{"1":{"name":"aa"},"2":{"name":"bb"}},
"2":
{"1":{"name":"cc"},"2":{"name":"dd"}}
};
我尝试解析数据,但.length
不起作用:
for(x=1; x<=map_data.length; x++) {
for(y=1; y<=map_data[x].length; y++) {
// CODE
}
}
很多,非常感谢!
答案 0 :(得分:7)
这不是一个数组,它们是简单的对象,这就是你不能使用length
属性的原因。
您需要使用for...in
声明:
for(var x in map_data) {
if (map_data.hasOwnProperty(x))
for(var y in map_data[x]) {
if (map_data[x].hasOwnProperty(y)) {
// CODE
}
}
}
hasOwnProperty
检查是因为此语句遍历所有属性,是否继承,以及某些内容(如某些JavaScript框架)是否增强了Array.prototype
或Object.prototype
个对象,这些增强属性也将被迭代。
你应该知道这个陈述无论如何都不能确保迭代的顺序。
我建议你使用“真正的”数组:
[
[{"name":"aa"},{"name":"bb"}],
[{"name":"cc"},{"name":"dd"}]
]
通过这种方式,您将能够使用length
属性迭代索引。
答案 1 :(得分:2)
由于map_data
是对象而不是数组,因此您需要使用for
/ in
循环:
for (var x in map_data) {
// check for hasOwnProperty omitted for simplicity.
for (var y in map_data[x]) {
// CODE.
}
}
但最好将JSON作为数组[a,b,c]
而不是对象{"0":a,"1":b,"2":c}
发送。
答案 2 :(得分:2)
hasOwnProperty
用于确定对象是否具有指定属性作为该对象的直接属性,而不考虑其原型链。
for(var i in map_data){
if(map_data.hasOwnProperty(i)){
for(var j in map_data[i]){
if(map_data[i].hasOwnProperty(j)){
/*do whatever you want with map_data[i][j]*/
}
}
}
}
答案 3 :(得分:0)
使用for .. in
构造:
for (var m in map_data) {
// ...
}
另外,我必须注意,这不是“JSON数组”,而是嵌套对象。 JSON只是嵌套JS对象和数组的字符串表示。
答案 4 :(得分:0)
如果它对某人有帮助,那就是c#和javascript的一个例子:
C#:
List<List<string>> list_array = new List<List<string>>();
JavaScriptSerializer jss = new JavaScriptSerializer();
string _myJSONstring = jss.Serialize(list_array);
/ *在这种情况下,list_array是一个二维列表,但可以是一个数组, 如果你打印_myJSONstring,这将显示如下:“[[”XX“,”AAAA“],[”YY“,”BBBB“]]”* /
的javascript:
到一个从c#中获取字符串的函数:
var a = JSON.parse(array);
for (var t = 0; t < array.length; t++) {
for (v = 0; v < array[t].length; v++) {
alert(array[t][v]);
}
}