注意:
此答案的第一部分假设您知道 JS 中数组和对象之间的区别,并且您用作键的值是数字,而不是字符串。
第一件事。确保,不管是什么data
,它都是一个数组的 json 表示,而不是一个对象字面量。尝试console.log(data);
,并检查您的控制台。如果你看到类似的东西:
"{"1":"123"}"
然后一个for
循环就不会切断它,因为它jPunten
是一个对象,而不是一个数组。一个数组看起来像:
"[123,4342]"
循环对象是使用for...in
循环完成的:
for(var property in jPunten)
{
if (jPunten.hasOwnProperty(property))
{
console.log(jPuntent[property].CARDNR);//this will work
}
}
但请访问json.org了解有关 JSON 格式的详细信息,并查看 MDN,例如hasOwnProperty
. MDN 也有一个不错的列表,其中包含关于您可以在 JS 中使用的每种循环类型的良好文档。
无论如何,回到手头的问题:
仅限数字键:
如果要将变量初始化为 JS 的 2D 数组,则应在主数组中声明第二个(内部)数组。
简而言之:
var puntmap = [][];//WRONG
//should be:
var puntmap = [[]];
如果您考虑一下,这是有道理的:如果[]
是一个数组,那么[][]
是两个独立的数组。如果一个数组应该是另一个数组的一部分,那么只需将其写入该数组中即可:
[//an array
[]//first element in the array => an array
]
但是鉴于您似乎正在填充一个稀疏数组(查看我对这个问题的回答,我在其中解释了稀疏数组的概念),您可能需要考虑对象文字,或者只是声明puntmap
为任何旧数组。
然后,像这样填充您的数组:
var puntmap = [];
for (var i=0;i<jPunten.length;++i)
{
//create an array under key jPunten[i].CARDNR, if it doesn't exist already
puntmap[jPunten[i].CARDNR] = puntmap[jPunten[i].CARDNR] || [];
//then, assign your value
puntmap[jPunten[i].CARDNR][jPunten[i].BITNR] = jPunten[i].STATDEV;
}
字符串常量作为键(属性)
如果这个假设(jPunten[i].CARDNR
等)是数字的,是错误的,那么请考虑直接使用一个对象。无论如何,该数组将被强制转换为一个对象,只有您的代码不会让任何人相信该length
属性,并且其他 Array 方法可用...
var puntmap = {};//create object literal
for (var i=0;i<jPunten.length;++i)
{
//create an array under key jPunten[i].CARDNR, if it doesn't exist already
if (!puntmap.hasOwnProperty(jPunten[i].CARDNR))
{//if object does not have property
puntmap[jPunten[i].CARDNR] = {};//create child object literal
//or, if jPunten[i].BITNR is always numeric:
puntmap[jPunten[i].CARDNR] = [];//you can use an array here!
}
//then, assign your value as you would
puntmap[jPunten[i].CARDNR][jPunten[i].BITNR] = jPunten[i].STATDEV;
}
现在您的代码,因为您使用的是对象文字,不会混淆任何人,也没有人会尝试执行以下操作:
puntmap.slice(12,3);
其中,在一个对象上(PHP 中的 assoc 数组)会抛出一个错误。