Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript::如何获取关联数组到数组变量的键?_Javascript_Regex_Arrays_Hash_Associative Array - Fatal编程技术网

Javascript::如何获取关联数组到数组变量的键?

Javascript::如何获取关联数组到数组变量的键?,javascript,regex,arrays,hash,associative-array,Javascript,Regex,Arrays,Hash,Associative Array,让我们使用如下关联数组: 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.l

让我们使用如下关联数组:

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

在2020年,每个浏览器都支持IE9。这就是路

JavaScript 1.8.5内置了此功能。它返回所有键的数组。对于不受支持的浏览器(),可以使用垫片

作为一个示例,请参见此()

有没有简单/快捷的方法可以在没有循环的情况下获得数组变量的键数组

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

如果是这样的话,另外,是否可以对键列表应用一些正则表达式,只获取与这种模式匹配的键(比如说
/^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年底编写此部分):


更重要的是,它有这个特性。Mozilla的JavaScript实现了它,但其他人也实现了它。+1::感谢您的及时响应。问题是,如果使用这个内置功能更快,将进行测试…这里有一个不同的,包含一个循环的键+1::是的,这很简单,我正在尝试使用优化的方式,因为我将使用大型阵列,所以这是我尝试使用一些内置功能的唯一原因,如果可能的话@Ω梅加:很公平。遗憾的是,没有,没有结合这些步骤的内置方式。ES5还有
Array#filter
,您可以将其与
Object.keys
结合使用,但这需要对每个键的迭代器函数进行函数调用,这可能无法达到目的。当我从头开始创建对象时,为什么需要使用
hasOwnProperty
?如果这样的对象没有内部变量和函数,还会弹出哪些“键”?省略
hasOwnProperty
是否有助于加速算法@Ωmega:如果您完全控制代码库,并且使用
{}
新对象
(最好是前者)来创建对象,并且您没有向
对象.prototype添加任何可枚举属性(您可能没有,这是一个非常糟糕的主意),那么是的,作为优化,您可以省略
hasOwnProperty
,因为规范定义的
Object.prototype
的所有属性都是不可枚举的。如果您要在通过构造函数创建的东西上使用它,该构造函数在原型上具有任何可枚举属性,那么您希望将其保留在中。
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;
}
function getKeys(obj, filter) {
    const keys = Object.keys(obj);
    return !filter ? keys : keys.filter(key => filter.test(key) && obj.hasOwnProperty(key));
}