注意:
此答案的第一部分假设您知道 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 格式的详细信息,请访问 json.org 和 check MDN on, for example hasOwnProperty。 MDN 还 has a nice list,提供了关于您可以在 JS 中使用的每种循环类型的良好文档。
无论如何,回到手头的问题:
仅限数字键:
如果要将变量初始化为 JS 的 2D 数组,则应该在主数组中声明第二个(内部)数组。
简而言之:
var puntmap = [][];//WRONG
//should be:
var puntmap = [[]];
如果您考虑一下,这是有道理的:如果[] 是一个数组,那么[][] 是两个独立的数组。如果一个数组应该是另一个数组的一部分,那么只需将其写入该数组中即可:
[//an array
[]//first element in the array => an array
]
但鉴于您似乎正在填充一个稀疏数组(检查my answer to this question,我在其中解释了稀疏数组的概念),您可能需要考虑对象文字,或者只是将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 属性,并且可以使用其他数组方法...
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 数组)会抛出错误。