JavaScript:如何将关联数组的键获取为数组变量?

9

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

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/,而无需另一个循环?

2个回答

17
有没有一种简单/简短的方法可以在不使用循环的情况下将键数组获取到数组变量中?
是的,ECMAScript 5定义了Object.keys来完成这个任务。(还有Object.getOwnPropertyNames可获得非枚举属性。)大多数现代浏览器引擎可能已经拥有它,旧的浏览器则没有,但很容易进行模拟(例如,this 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));
}

+1 :: 是的,这很简单,但我正在尝试使用优化的方式,因为我将要处理一个巨大的数组,这就是我想尽可能使用一些内置功能的唯一原因。 - Ωmega
@Ωmega:很好,但是没有内置的方法可以将这些步骤组合起来。ES5也有Array#filter,可以与Object.keys结合使用,但这需要针对每个键使函数调用回到迭代器函数,这可能会失去意义。 - T.J. Crowder
为什么在从头创建对象时使用hasOwnProperty是必要的?如果这样的对象没有内部变量和函数,还会出现哪些其他“键”?省略hasOwnProperty不会帮助加快算法速度吗? - Ωmega
1
@Ωmega:如果你完全控制代码库,而且你使用 {}new Object(最好是前者)来创建对象,并且你没有向 Object.prototype 添加任何可枚举属性(你可能不会这样做,这是一个非常糟糕的主意),那么是的,你可以省略 hasOwnProperty 作为一种优化,因为规范定义的 Object.prototype 的所有属性都是不可枚举的。如果你要在通过构造函数创建的具有任何可枚举原型属性的对象上使用它,则需要将其保留。 - T.J. Crowder

15
在2020年,每个浏览器都支持从IE9开始使用这种方式。 JavaScript 1.8.5内置了此功能,使用 Object.keys() 可以返回所有键的数组。对于不支持的浏览器,您可以使用一个shim(MDN也提供了帮助)。例如,请参见此处的 (jsFiddle)...
var obj = { "cat" : "meow", "dog" : "woof"};
alert(Object.keys(obj)); // "cat,dog"

更重要的是,ECMAScript 5拥有此功能。Mozilla的JavaScript实现了它,但其他语言也同样实现了它。 - T.J. Crowder
+1 :: 感谢您的及时回复。问题是,如果使用这个内置功能更快 - 我会测试一下... - Ωmega
这是一个包含键的循环的不同示例。http://jsperf.com/object-keys - scottheckel

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