说我们有这个:
const v = [1,2,3];
v.foo = 5;
console.log(JSON.stringify(v));
我们将得到:
'[1,2,3]'
并且将忽略数组上的'foo'属性 . 但是,如果我们这样做:
console.log(Object.keys(v));
我们将得到:
[ '0', '1', '2', 'foo' ]
我的问题是 - 我们如何只从数组中获取标准键,并忽略任何添加到数组中的属性?
我知道如何做到这一点的唯一方法是:
const keys = Object.keys(v).filter(k => Number.isInteger(parseInt(k)));
有没有更好的办法?
3 回答
您可以使用
其中keys在整数索引(不是属性名称!)上返回迭代器 . 请注意,与
Object.keys
相反,它忽略了数组的稀疏性,并且即使对于空洞也会产生索引 .我想知道为什么你甚至不得不在数组上使用
Object.keys
. 数组只有索引,您可以使用简单的for (let i=0; i<v.length; i++)
循环生成它们 . 甚至是something likeArray.from({length: v.length}, (_, i) => i)
.你可以使用
Array.from
.建议不要弄乱数组键 . V8基于数组键进行性能评估,并做了一些非常好的假设,如果你修改,你将失去所有的好处 .
但是如果您不关心性能,那么您可以创建数组的副本,并且引擎不会复制自定义键 .
Object.keys([...v])