【问题标题】:Get all keys of a JavaScript object获取 JavaScript 对象的所有键
【发布时间】:2011-05-22 22:49:46
【问题描述】:

我想知道是否有一种快速的方法可以将关联数组的键提取到数组中,或者使用 JavaScript 以逗号分隔的列表(可以使用 jQuery)。

options = {key1: "value1", key2: "value2"};

结果应该是数组:

["key1", "key2"]

或者只是一个字符串:

"key1, key2"

【问题讨论】:

  • 我想你的意思是["key1","key2"] 不是{"key1","key2"}
  • 是的。太糟糕的数组从未在此处提及。
  • 那是因为在 JavaScript 中没有关联数组之类的东西。您所说的关联数组是具有属性列表的对象(因此,如何列出 javascript 对象的属性)。这也是为什么列出键的本机方法驻留在 Object 对象上 - Object.keys()。

标签: javascript jquery arrays javascript-objects


【解决方案1】:

您可以通过for 循环轻松获取它们的数组,例如:

var keys = [];
for(var key in options) {
  if(options.hasOwnProperty(key)) { //to be safe
    keys.push(key);
  }
}

然后怎么用keys,例如:

var keyString = keys.join(", ");

You can test it out here。 .hasOwnProperty() 检查是安全的,以防有人弄乱了对象原型等。

【讨论】:

    【解决方案2】:
    options = {key1: "value1", key2: "value2"};
    keys = Object.keys(options);
    

    【讨论】:

    • 请注意IE8及以下不支持此功能,目前全球7.3%的浏览器。
    • IE8 及以下版本现在约占全球浏览器的 1%。
    【解决方案3】:

    一种 jQuery 方法:

    var keys = [];
    options = {key1: "value1", key2: "value2"};
    $.each(options, function(key, value) { keys.push(key) })
    console.log(keys)
    

    【讨论】:

    • 你也可以使用keys[keys.length] = key;为了 IE 安全
    【解决方案4】:

    现在大部分主流浏览器都内置了这个功能,方法是Object.keys():

    var keys = Object.keys(options);
    //-> ["key1", "key2"]
    

    你也可以在不支持它的浏览器中使用一点 sn-p 来实现它:

    Object.keys = Object.keys || (function () {
        var hasOwnProperty = Object.prototype.hasOwnProperty;
    
        return function (o) {
            if (typeof o != "object" && typeof o != "function" || o === null)
                throw new TypeError("Object.keys called on a non-object");
    
            var result = [];
            for (var name in o) {
                if (hasOwnProperty.call(o, name))
                    result.push(name);
            }
    
            return result;
        };
    })();
    

    该 sn-p 的工作方式与 Nick Craver 的示例中的几乎相同,但有 2 个例外:

    • 如果您传入除 Object 以外的任何内容(或“关联数组”,如果您愿意),它将引发有意义的 TypeError。
    • 它将解决 Internet Explorer 中与 DOM 相关的烦人问题,其中集合没有 hasOwnProperty 方法。

    但是,这(以及此处的其他答案)无法解决 IE 枚举错误。您可以在 this answer here 上找到更多信息和部分解决方法。

    【讨论】:

      【解决方案5】:

      您现在可以使用

      Object.keys(obj)
      

      获取由对象中可用键组成的数组。 Mozilla has usage and availability information.

      【讨论】:

        【解决方案6】:

        你可以在 jQuery 中使用$.each():

        function keyArray(obj) {
          var rv = [];
          $.each(options, function(key) { rv.push(key); });
          return rv;
        }
        

        然后

        var keys = keyArray(options);
        

        给你["key1", "key2"]作为一个数组,你可以join得到一个字符串。

        【讨论】:

        • 我不提倡这样做的原因是它不安全,例如如果原型上有任何东西,它也会出现在列表中。 jQuery 不会在内部进行 hasOwnProperty() 检查,看看我的意思:jsfiddle.net/nick_craver/TJDCV
        • 哦,这很好——就我个人而言,缺乏这样的功能工具(“正确”工作)是我对 Prototype 最怀念的地方,我承认 Prototype 中的那些东西也是其最大问题的根源:-)
        • 我猜如果有一个可靠的实用程序将一个对象转换为一个键/值对数组(作为 2 元素数组),再加上一个 .zip() 函数,你可以走很长的路...
        猜你喜欢
        • 2014-12-24
        • 1970-01-01
        • 2016-08-21
        • 1970-01-01
        • 1970-01-01
        • 2011-06-18
        • 2017-06-07
        • 1970-01-01
        • 2017-05-08
        相关资源
        最近更新 更多