8

让我们有一个这样的关联数组:

var aArray = {};
aArray.id = 'test';
aArray['x1'] = [1,2,3];
aArray['stackoverflow'] = 'What\'s up?';
aArray['x2'] = [4,5,6];
var keys = [];
for(var key in aArray) {
  if (aArray.hasOwnProperty(key)) {
    keys.push(key);
  }
}
console.log(keys);

有没有简单/快捷的方法如何在没有循环的情况下获取数组变量的键数组

如果是这样,另外,是否可以将一些正则表达式应用于键列表以仅获取与这种模式(比如说 /^x/匹配的键而无需另一个循环?

4

2 回答 2

16

有没有简单/快捷的方法如何在没有循环的情况下获取数组变量的键数组..?

是的,ECMAScript 5 定义Object.keys了这样做。(Object.getOwnPropertyNames即使是不可枚举的也可以。)大多数现代浏览器引擎可能会有它,旧的不会,但它很容易填充(例如,这个 shim有)。

如果是这样,另外,是否可以将一些正则表达式应用于键列表以仅获取与这种模式匹配的键(比如说/^x/)而没有(另一个)循环?

不,没有内置功能,但它是一个相当简单的函数:

function getKeys(obj, filter) {
    var name,
        result = [];

    for (name in obj) {
        if ((!filter || filter.test(name)) && obj.hasOwnProperty(name)) {
            result[result.length] = name;
        }
    }
    return result;
}

或者基于Object.keys(并使用 ES2015+ 功能,因为我在 2020 年末写这部分):

function getKeys(obj, filter) {
    const keys = Object.keys(obj);
    return !filter ? keys : keys.filter(key => filter.test(key) && obj.hasOwnProperty(key));
}
于 2012-07-19T13:00:45.290 回答
14

在 2020 年,所有浏览器都支持这一点回到 IE9。这是要走的路。

JavaScript 1.8.5 使用Object.keys()内置了这个功能。它返回一个包含所有键的数组。您可以为不受支持的浏览器使用 shim(MDN 对此也有帮助)。

作为一个例子,看看这个(jsFiddle)......

var obj = { "cat" : "meow", "dog" : "woof"};
alert(Object.keys(obj)); // "cat,dog"
于 2012-07-19T12:58:05.847 回答