【问题标题】:Array of array returning NaN返回 NaN 的数组数组
【发布时间】:2012-03-14 20:30:06
【问题描述】:

那么为什么 myarray[bla][bl] 总是等于 NaN?如果我对 1 维 (myarray[bla]) 做同样的事情,我会得到数字。

var bla = 'blabla';
var bl = 'bla';
var myarray = [];
for (i = 0; i < 10; i++) {
    if (!myarray[bla]) {
        myarray[bla] = [];
    }
    myarray[bla][bl] += i;
    console.log(myarray[bla][bl] + " + " + i);
}​

【问题讨论】:

  • 因为 myarray[bla][bl] 没有设置...

标签: javascript


【解决方案1】:

好的,让我们逐步执行您的循环,将变量bla 的实例替换为字符串值'blabla'

if (!myarray['blabla']) {
  myarray['blabla'] = [];
}

javascript 中的数组是按整数值索引的。您的代码在这里所做的是向名为blabla 的数组实例添加一个expando 属性。那就是:

myarray.blabla = [];

现在重新考虑您的增量声明:

myarray['blabla'][bl] += i;

或者,使用 expando 属性:

myarray.blabla.bl  // remember that "myarray.blabla" is set to the empty array above

这试图做的是访问空数组上名为bl 的属性。这就是为什么你会在这里收到undefined

无论如何,作为最佳实践,您可能希望避免在 javascript 中使用数组,例如哈希表,因为这样的问题在足够长的时间后必然会出现。

【讨论】:

  • 我猜 javascript 中哈希表的最佳实践是 JSON 吗?我来自 perl 背景,你只需要知道哈希。
  • @David - 有点 - JSON 对象和 javascript 对象之间实际上是有区别的,这里比我做得更好:stackoverflow.com/questions/6489783 - 但总的来说,是的,你有时可以使用简单的对象实例作为哈希表。这个不会起作用的一个值得注意的例外是你的哈希表键类型不是简单的字符串——比如自定义对象类型。这个页面有一些很好的解释为什么对象/数组的行为方式:timdown.co.uk/jshashtable
【解决方案2】:

如果我们扩大一点,我希望你能看到问题,

if (!myarray[bla]) {
    myarray[bla] = [];
}
myarray[bla][bl] = myarray[bla][bl] + i;

提示:myarray[bla][bl] = undefined

【讨论】:

    【解决方案3】:

    因为myarray[bla][bl]没有设置...,你需要

    if ( !myarray[bla][bl] ){ myarray[bla][bl] = 0; }
    

    【讨论】:

      猜你喜欢
      • 2015-08-03
      • 2022-11-03
      • 2020-07-14
      • 2019-07-28
      • 2014-04-21
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 2020-07-14
      相关资源
      最近更新 更多