【问题标题】:Getting a list of associative array keys获取关联数组键的列表
【发布时间】:2010-10-08 05:20:11
【问题描述】:

我在 JavaScript 中有一个关联数组:

var dictionary = {
    "cats": [1,2,3,4,5],
    "dogs": [6,7,8,9,10]
};

我如何获得这本词典的键?即,我想要

var keys = ["cats", "dogs"];

只是为了让术语正确 - JavaScript 中没有“关联数组”之类的东西 - 从技术上讲,这只是一个 object,它是我们想要的对象键。

【问题讨论】:

  • 使用 lodash JS 的简单方法 - lodash.com/docs#keys
  • 感谢您澄清术语!你可以在明亮的红色闪烁灯光下把它放大一点吗?
  • @Joe 如果有机会,我会在 google 中为您提供第一个结果

标签: javascript arrays


【解决方案1】:

我目前正在使用Rob de la Cruz's reply

Object.keys(obj)

在一个早期加载的文件中,我有几行代码从 Internet 上的其他地方借来的,其中涵盖了没有内置 Object.keys 的旧版本脚本解释器的情况。

if (!Object.keys) {
    Object.keys = function(object) {
        var keys = [];
        for (var o in object) {
            if (object.hasOwnProperty(o)) {
                keys.push(o);
            }
        }
        return keys;
    };
}

我认为这对于大型项目来说是两全其美:简单的现代代码和对旧版本浏览器的向后兼容支持等。

当 Rob de la Cruz 的 Object.keys(obj) 本身不可用。

【讨论】:

    【解决方案2】:

    简单的jQuery方式:

    这是我用的:

    DictionaryObj 是您要通过的 JavaScript 字典对象。而value,key当然是他们在字典中的名字。

    $.each(DictionaryObj, function (key, value) {
        $("#storeDuplicationList")
            .append($("<li></li>")
            .attr("value", key)
            .text(value));
    });
    

    【讨论】:

    • 这需要 jQuery(这很好)但你忘了提到它:-)
    • @Exzile 函数定义中的参数名称非常混乱。它在api.jquery.com/jquery.each 处说回调是 Function( String propertyName, Object valueOfProperty )。你的名字正好相反。
    • @Chris 我会为你更新。感谢您指出这一点。
    【解决方案3】:

    只是一个简短的说明。如果您使用库(jQueryPrototype 等),请谨慎使用 for..in,因为它们中的大多数都会向创建的对象(包括字典)添加方法。

    这意味着当您遍历它们时,方法名称将显示为键。如果您使用的是库,请查看文档并查找可枚举部分,您将在其中找到用于迭代对象的正确方法。

    【讨论】:

      【解决方案4】:
      for (var key in dictionary) {
        // Do something with key
      }
      

      这是for..in statement

      【讨论】:

      • 刚刚注意到“dogs”和上面的数组之间应该有一个冒号而不是逗号。假设这是由于转录造成的。
      • 检查dictionary.hasOwnProperty(key) 非常重要,否则您最终可能会使用原型链中的方法..
      • 来自同一篇文章:以任意顺序迭代对象的可枚举属性。如果键顺序很重要,您需要执行一些操作,例如将它们推送到数组中,对其进行排序,然后使用 for() 循环从排序后的数组中获取键,用于索引原始对象。
      • 当然,通过省略 dictionary.hasOwnProperty 检查您是否可以确定对象缺少原型来进行优化是公平的。但重要的是要意识到在这种情况下原型继承的可能性,因为 JavaScript 字典实际上是对象。
      【解决方案5】:

      您可以使用:Object.keys(obj)

      例子:

      var dictionary = {
        "cats": [1, 2, 37, 38, 40, 32, 33, 35, 39, 36],
        "dogs": [4, 5, 6, 3, 2]
      };
      
      // Get the keys
      var keys = Object.keys(dictionary);
      
      console.log(keys);

      请参阅下面的参考以了解浏览器支持。它在 Firefox 4.20、Chrome 5 和 Internet Explorer 9 中受支持。Object.keys() 包含一个代码 sn-p,如果您的浏览器不支持 Object.keys(),您可以添加该代码。

      【讨论】:

      【解决方案6】:

      试试这个:

      var keys = [];
      for (var key in dictionary) {
        if (dictionary.hasOwnProperty(key)) {
          keys.push(key);
        }
      }
      

      hasOwnProperty 是必需的,因为可以将键插入到dictionary 的原型对象中。但您通常不希望这些键包含在您的列表中。

      例如,如果你这样做:

      Object.prototype.c = 3;
      var dictionary = {a: 1, b: 2};
      

      然后在dictionary 上执行for...in 循环,你会得到ab,但你也会得到c

      【讨论】:

      • 不需要声明"var keys = []",除非你需要在循环后使用。
      • @mzalazar,你最好这样做,否则它将成为一个全局变量,这是不好的做法。
      • @b00t 我虽然通过在 for 循环中声明一个变量......它不会被设置在全局空间......现在你让我怀疑 hehe :)
      • @mzalazar,但如果您只是使用keys.push(key);,则在任何时候都不会声明它(keys)。您只是从全局名称空间中提取(并因此声明它)。 :)
      猜你喜欢
      • 1970-01-01
      • 2015-03-19
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多