【问题标题】:Why does this JavaScript array return undefined?为什么这个 JavaScript 数组返回未定义?
【发布时间】:2014-08-28 13:20:08
【问题描述】:

当我使用节点运行此文件时,有人可以解释为什么一个值返回为未定义而另一个未包含在列表中。

  • 0 凸轮
  • 1 道格
  • 2 迦勒
  • 3 大卫
  • 4 凯利
  • 5 阿帕纳
  • 0 凸轮
  • 1 道格
  • 2 未定义
  • 3 大卫

    var queue = {};
    
    queue[0] = 'Cam';
    queue[1] = 'Doug';
    queue[2] = 'Caleb';
    queue[3] = 'David';
    queue[4] = 'Kelli';
    queue[5] = 'Aparna';
    
    var sorted_keys = Object.keys(queue).sort();
    
    for (var key in sorted_keys) {
    console.log(key + " " + queue[key]);
    }
    
    for (var key in sorted_keys) {
    if (key == 2 || key == 4) { // trying to mock disable accounts and remove
        delete queue[key];
     }
    }
    
    sorted_keys = Object.keys(queue).sort();
    
    for (var key in sorted_keys) {
        console.log(key + " " + queue[key]);
    }
    

【问题讨论】:

  • Array.prototype.sort 就位。
  • 你应该停止使用 for ... in 来遍历 JavaScript 数组。
  • 对有序集合使用数组而不是对象,或者随意重新发明轮子。
  • @pointy:想解释一下为什么?
  • @defau1t JavaScript 与 PHP 不同 - 规范甚至不保证 for ... in 以任何特定顺序显示属性名称!这也会导致 V8 的优化问题。

标签: javascript arrays sorting hashmap associative-array


【解决方案1】:

您的主要问题是您正在迭代 sorted_keys 这是一个键数组,并且您试图使用数组中的索引值来索引到 queue 对象,但这是数组索引,而不是queue 对象的密钥。您需要从数组中获取实际值,而不是从数组中获取索引,因为这是queue 对象的键所在。

您也不应该使用 for/in 迭代数组,尽管这并不是真正导致问题的原因。

如果您将上一次迭代更改为此,您将看到您所期望的:

for (i = 0; i < sorted_keys.length; i++) {
    key = sorted_keys[i];
    console.log(key + " " + queue[key]);
}

工作演示:http://jsfiddle.net/jfriend00/5dPsR/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    相关资源
    最近更新 更多