忽略非标准数组键



假设我们有这个:

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

有更好的方法吗?

您可以使用

Array.from(v.keys())

其中keys返回整数索引上的迭代器(而不是属性名!(。请注意,与Object.keys相比,它忽略了阵列的稀疏性,甚至为空穴生成索引。

我想知道为什么必须在数组上使用Object.keys。数组只有索引,您可以使用简单的for (let i=0; i<v.length; i++)循环生成索引。甚至是像Array.from({length: v.length}, (_, i) => i)这样的东西。

建议不要乱用数组键。V8基于数组键进行性能评估,并做了一些非常好的假设,如果您修改这些假设,您将失去所有好处。

但如果你不关心性能,那么你可以创建一个数组的副本,引擎不会复制自定义键。

Object.keys([...v])

您可以使用Array.from

const v = [1,2,3];
v.foo = 5;
const keys = Array.from(v);
console.log(keys);

最新更新