【问题标题】:Two dimensional array like in PHPPHP 中的二维数组
【发布时间】:2013-10-31 13:15:09
【问题描述】:

我正在寻找的是这段代码的 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中没有关联数组这样的东西,所以puntmap实际上应该是包含另一个对象的对象。

标签: javascript php json


【解决方案1】:

注意:
此答案的第一部分假设您知道 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 格式的详细信息,请访问 json.orgcheck MDN on, for example hasOwnProperty。 MDN 还 has a nice list,提供了关于您可以在 JS 中使用的每种循环类型的良好文档。
无论如何,回到手头的问题:

仅限数字键:

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

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 数组)会抛出错误。

【讨论】:

  • 关键确实是数字,哇,多么精彩的文章啊,先生,您可以给点帽子了!
  • 但是,我不明白你为什么认为我在使用稀疏数组?我确实希望填写我的所有元素。cardnr 和 bitnr 中的数字是有序的并且没有间隙(只有 bitnr 有时有间隙,但范围只有 1-16,所以没关系)
  • @PHPnooblet:我的意思是您的puntmap 数组可能没有正常 索引序列(0,1,2,3...),但是,例如123,4355,56990,... 所以数组是sparse。 PHP json_encode(您似乎在使用 php 来获取数据)将此类数组作为对象文字返回,因此我最后的编辑集中在 data 的值上。我还添加了一个链接,指向我对 JS 中稀疏数组的问题的答案之一
猜你喜欢
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多