我正在寻找的是这段代码的Javascript等效物:
$map[$card][$bit] = $val;
(如您所知,这也会立即实例化数组)
我尝试并研究了一下,但似乎还有许多其他方法可以做到这一点,我想知道我的特定代码的最佳方法是什么。我目前正在从数据库中检索$card和$bit,并创建某种映射,为地图中的每个位置提供一个值。
Javascript代码:
var jPunten = JSON.parse(data);
var puntmap = [][];
for (var i=0;i<jPunten.length;i++)
{
puntmap[jPunten[i].CARDNR][jPunten[i].BITNR] = jPunten[i].STATDEV;
}
注意:
本答案的第一部分假设您知道 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 中使用的每种循环类型的良好文档。
无论如何,回到手头的问题:
仅限数字键:
如果要将变量初始化为 2D 数组 om JS,则应在主数组内声明第二个(内部)数组。
总之:
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-speak中的assoc arrray)将抛出错误。