1

我正在寻找的是这段代码的 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;
}
4

1 回答 1

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 格式的详细信息,并查看 MDN,例如hasOwnProperty. MDN 也有一个不错的列表,其中包含关于您可以在 JS 中使用的每种循环类型的良好文档。
无论如何,回到手头的问题:

仅限数字键:

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

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 中的 assoc 数组)会抛出一个错误。

于 2013-10-31T13:21:29.020 回答