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