获取关联数组键的列表

IT技术 javascript arrays
2021-01-26 21:44:21

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

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

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

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

只是为了使术语正确 - JavaScript 中没有“关联数组”这样的东西 - 从技术上讲object,这只是 an并且它是我们想要的对象键。

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

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

无需声明“var keys = []”,除非您需要在循环后使用它。
2021-03-17 21:44:21
@mzalazar,你最好这样做,否则它将成为一个全局变量,这是不好的做法。
2021-03-20 21:44:21
@mzalazar,但你没有宣布它(在任何时候,如果你仅仅使用)keys.push(key);您只是从全局命名空间中提取(并因此声明)。:)
2021-03-30 21:44:21
@b00t 我虽然通过在 for 循环中声明一个变量......它不会在全局空间中设置......现在你让我怀疑 hehe :)
2021-04-06 21:44:21
for (var key in dictionary) {
  // Do something with key
}

这是for..in 语句

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

您可以使用: 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()包含一个代码片段,如果Object.keys()您的浏览器不支持,您可以添加该代码片段

我现在将其切换为已接受的答案。只有 IE8 不再支持它(可以使用 polyfill developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-04-06 21:44:21

只是一个快速的笔记。for..in如果您使用库(jQueryPrototype等),请小心使用,因为它们中的大多数都会向创建的对象(包括字典)添加方法。

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

简单的jQuery方式:

这是我使用的:

DictionaryObj 是您要查看的 JavaScript 字典对象。和value,关键当然是他们在字典中的名字。

$.each(DictionaryObj, function (key, value) {
    $("#storeDuplicationList")
        .append($("<li></li>")
        .attr("value", key)
        .text(value));
});
@Exzile 函数定义中的参数名称非常混乱。它在api.jquery.com/jquery.each 上说回调是 Function( String propertyName, Object valueOfProperty )。你的名字暗示相反。
2021-04-05 21:44:21
@Chris 我会为你更新的。感谢您指出了这一点。
2021-04-09 21:44:21
这需要 jQuery(这很好),但你忘了提及它:-)
2021-04-11 21:44:21