像PHP中的二维数组

时间:2013-10-31 13:15:09

标签: javascript php json

我正在寻找的是与此代码等效的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;
}

1 个答案:

答案 0 :(得分:5)

注意:
本回答的第一部分假设您了解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格式的详细信息,以及check MDN on, for example hasOwnProperty。 MDN也has a nice list,有关JS可以使用的每种循环的良好文档。
无论如何,回到手头的问题:

仅限数字键:

如果要将变量初始化为二维数组(JS),应该声明主数组内的第二个(内部)数组。
简而言之:

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 arrray)会抛出一个错误。