二维数组,就像在 PHP 中一样


Two dimensional array like in PHP

我正在寻找的是这段代码的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)将抛出错误。