首页 文章

忽略非标准数组键

提问于
浏览
4

说我们有这个:

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 回答

  • 5

    您可以使用

    Array.from(v.keys())
    

    其中keys在整数索引(不是属性名称!)上返回迭代器 . 请注意,与 Object.keys 相反,它忽略了数组的稀疏性,并且即使对于空洞也会产生索引 .

    我想知道为什么你甚至不得不在数组上使用 Object.keys . 数组只有索引,您可以使用简单的 for (let i=0; i<v.length; i++) 循环生成它们 . 甚至是something like Array.from({length: v.length}, (_, i) => i) .

  • 1

    你可以使用 Array.from .

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

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

    但是如果您不关心性能,那么您可以创建数组的副本,并且引擎不会复制自定义键 .

    Object.keys([...v])

相关问题