像PHP中的二维数组

Faa*_*rtz 1 javascript php json

我正在寻找的是这个代码的Javascript等价物:

$map[$card][$bit] = $val;
Run Code Online (Sandbox Code Playgroud)

(如你所知,这也会立即实例化数组)

我尝试和研究了一下,但似乎有很多其他方法可以做到这一点,我想知道什么是我的具体代码的最佳方法.我正在从数据库中检索$ 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;
}
Run Code Online (Sandbox Code Playgroud)

Eli*_*gem 5

注意:
本回答的第一部分假设您了解JS中数组和对象之间的区别,并且您用作键的值是数字,而不是字符串.
首先要做的事情.确保无论data保持什么,它都是数组的json表示,而不是对象文字.试试console.log(data);,检查你的控制台.如果你看到类似的东西:

"{"1":"123"}"
Run Code Online (Sandbox Code Playgroud)

然后for循环不会切割它,因为它jPunten是一个对象,而不是一个数组.数组看起来像:

"[123,4342]"
Run Code Online (Sandbox Code Playgroud)

使用循环来循环对象for...in:

for(var property in jPunten)
{
    if (jPunten.hasOwnProperty(property))
    {
        console.log(jPuntent[property].CARDNR);//this will work
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,请访问json.org以获取有关JSON格式的详细信息,并检查MDNhasOwnProperty.MDN也有一个很好的列表,在JS中可以使用的每种类型的循环都有很好的文档.
无论如何,回到手头的问题:

仅限数字键:

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

var puntmap = [][];//WRONG
//should be:
var puntmap = [[]];
Run Code Online (Sandbox Code Playgroud)

这是有意义的,如果你考虑一下:如果[]是一个数组,那么[][]是两个独立的数组.如果一个数组应该是另一个数组的一部分,那么只需将其写入该数组:

[//an array
    []//first element in the array => an array
]
Run Code Online (Sandbox Code Playgroud)

但是考虑到你似乎在填充一个稀疏数组(检查我对这个问题的答案,我解释了稀疏数组的概念),你可能想要考虑对象文字,或者只是声明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;
}
Run Code Online (Sandbox Code Playgroud)

字符串常量作为键(属性)

如果(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;
}
Run Code Online (Sandbox Code Playgroud)

现在你的代码,因为你正在使用对象文字,不会混淆任何人,没有人会尝试做类似的事情:

puntmap.slice(12,3);
Run Code Online (Sandbox Code Playgroud)

对于一个对象(在PHP中说的assoc arrray)会抛出一个错误.