获取关联数组键的列表


258

我在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
Chemical Programmer

感谢您澄清术语!您能否在明亮的红色闪烁灯中将其放大一些?
乔·菲利普斯

@Joe如果有机会,我将为您在google中取得第一个结果
Simon_Weaver

Answers:


84

您可以使用: 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,IE9支持该功能。下面的链接包含一个代码段,如果Object.keys()浏览器不支持,则可以添加该代码段。

https://developer.mozilla.org/zh-CN/JavaScript/Reference/Global_Objects/Object/keys


我现在将其切换为可接受的答案。只有IE8不支持它了(对于其中填充工具可用developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Simon_Weaver

382

试试这个:

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};

然后做一个for...in循环dictionary,你将得到ab,但是你也将得到c


无需声明“ var keys = []”,除非您需要在循环之后使用它。
mzalazar 2014年

2
@mzalazar,您最好这样做,否则它将是一个全局变量,这是一种不好的做法。
2016年

@ b00t我虽然在for循环中声明了一个变量...但不会在全局空间中设置...现在您让我感到怀疑了:)
mzalazar

2
@mzalazar,但是如果您只是使用,则不会在任何时候声明它(keys.push(key);。您只是从全局名称空间中提取(并进行声明)。:)
b00t

183
for (var key in dictionary) {
  // do something with key
}

这是for..in语句


1
只是注意到“ dogs”和上面的数组之间应该有一个冒号而不是逗号。假设这是由于转录。
wombleton

68
非常重要的检查dictionary.hasOwnProperty(key),否则你可能会从原型链方法结束..
Tigraine

4
来自同一篇文章:以任意顺序遍历对象的可枚举属性。如果键顺序很重要,则需要执行一些操作,例如将它们推入数组中,对其进行排序,然后使用for()循环从排序后的数组中获取键,并以此为原始对象建立索引。
mcmlxxxvi

1
当然,通过省略dictionary.hasOwnProperty检查是否可以确定对象是否缺少原型来进行优化是合理的。但是重要的是要意识到在这种情况下原型继承的可能性,因为JavaScript字典实际上是对象。
fixermark 2015年

16

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

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


3

简单的JQUERY方法。

这就是我使用
DictionaryObj作为您要通过的javascript字典对象的方式。值,课程的重点是字典中它们的名称。

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

1
这需要jQuery(很好),但是您忘了提它了:-)
Simon_Weaver

@Exzile函数定义中的参数名称非常混乱。它在api.jquery.com/jquery.each上说回调是Function(字符串propertyName,Object valueOfProperty)。您的名字暗示了相反的意思。
克里斯(Chris)

@克里斯,我会为您更新。感谢您指出了这一点。
2015年

0

我目前正在使用Rob de la Cruz的回复

Object.keys(obj)

在早期加载的文件中,我从互联网上的其他地方借来了几行代码其中涵盖了未内置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)本身不可用时,它将JW的解决方案有效地放入了函数中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.