获取JavaScript对象的所有键

23

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

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

结果应该是数组:

["key1", "key2"]

或者只是一个字符串:

"key1, key2"

2
我认为你的意思是 ["key1","key2"] 而不是 {"key1","key2"} - epascarello
可能是如何列出JavaScript对象的属性的重复问题。 - Andy E
很遗憾,数组从未在那里提到过。 - tishma
3
这是因为JavaScript中不存在关联数组。你所谓的关联数组其实是一个带有属性列表的对象(因此,如何列出Javascript对象的属性)。这也是为什么列出键的本地方法位于Object对象上 - *Object.keys()*。 - Andy E
6个回答

31

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

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

然后根据需要使用keys,例如:

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

你可以在此处测试。使用.hasOwnProperty()检查是为了安全起见,以防有人混淆了对象原型等。


29
options = {key1: "value1", key2: "value2"};
keys = Object.keys(options);

请注意,此功能不支持IE8及以下版本,目前全球浏览器占比为7.3%。 - Michel Müller
3
IE8及更低版本现在全球浏览器的占比约为1%。 - Stephen Ostermiller

5
用jQuery实现的方法:
var keys = [];
options = {key1: "value1", key2: "value2"};
$.each(options, function(key, value) { keys.push(key) })
console.log(keys)

1
你也可以使用 keys[keys.length] = key; 来确保兼容IE。 - Ege Özcan

3

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

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

您可以使用一小段代码在不支持它的浏览器中实现此功能:
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;
    };
})();

这个代码片段与Nick Craver示例中的代码片段非常相似,但有两个例外:

  • 如果传入的不是对象(或"关联数组"),它将抛出一个有意义的TypeError。
  • 它将解决Internet Explorer中一个烦人的与DOM相关的问题,即集合没有hasOwnProperty方法。

然而,这个答案(以及其他答案)并不能解决IE枚举错误。您可以在此答案中找到更多信息和部分解决方法


2

0
你可以在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() 检查,请参见此处:http://www.jsfiddle.net/nick_craver/TJDCV/ - Nick Craver
哦,那是一个很好的观点 - 就我个人而言,我最想念 Prototype 这样的功能工具(能够“正确”地工作),我也承认这些在 Prototype 中的东西也是它最大问题的根源 :-) - Pointy
我猜想,如果有一个可靠的工具可以将对象转换为键/值对数组(作为2元素数组),再加上一个.zip()函数,你就可以走得更远... - Pointy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接