【问题标题】:Javascript :: How to get keys of associative array to array variable?Javascript :: 如何将关联数组的键获取到数组变量?
【发布时间】:2012-07-18 16:01:33
【问题描述】:

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

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

【问题讨论】:

    标签: javascript regex arrays hash associative-array


    【解决方案1】:

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

    JavaScript 1.8.5 使用 Object.keys() 内置了此功能。它返回一个所有键的数组。对于不受支持的浏览器,您可以使用 shim (MDN has help on that too)。

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

    var obj = { "cat" : "meow", "dog" : "woof"};
    alert(Object.keys(obj)); // "cat,dog"
    

    【讨论】:

    • 更重要的是,ECMAScript 5 有这个功能。 Mozilla 的 JavaScript 实现了它,但其他人也是如此。
    • +1 :: 感谢您的及时回复。问题是,如果使用此内置功能更快 - 将测试...
    • 这是一个不同的,其中包含一个循环的键。 jsperf.com/object-keys
    【解决方案2】:

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

    是的,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:很公平。可悲的是,不,没有结合这些步骤的内置方式。 ES5 也有 Array#filter,您可以将其与 Object.keys 结合使用,但这需要为每个键将函数调用回您的迭代器函数,这可能会破坏目的。
    • 当我从头开始创建对象时,为什么必须使用hasOwnProperty?如果此类对象没有内部变量和函数,可能会弹出哪些其他“键”?省略hasOwnProperty 会不会有助于加速算法?
    • @Ωmega:如果您完全控制了代码库,并且您使用 {}new Object(最好是前者)来创建对象,并且您不添加Object.prototype 的任何可枚举属性(您可能没有,这是一个非常糟糕的主意),然后是的,作为一种优化,您可以省略 hasOwnProperty,因为规范定义的 Object.prototype 的所有属性都是非可数的。如果您打算在通过构造函数创建的东西上使用它,该构造函数在原型上具有任何可枚举属性,那么您希望将其保留。
    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 2014-05-26
    • 2019-11-29
    • 2012-09-12
    • 1970-01-01
    • 2017-09-22
    相关资源
    最近更新 更多