忽略非标准阵列键

时间:2018-12-08 22:13:10

标签: javascript node.js json

说我们有这个

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 个答案:

答案 0 :(得分:5)

您可以使用

Array.from(v.keys())

其中this answer返回一个整数索引的迭代器(不是属性名!)。请注意,与Object.keys相比,它忽略了数组的稀疏性,甚至为孔生成了索引。

我想知道为什么您甚至必须在数组上使用Object.keys。数组仅包含索引,您可以通过简单的for (let i=0; i<v.length; i++)循环来生成它们。甚至使用keys Array.from({length: v.length}, (_, i) => i)

答案 1 :(得分:1)

建议不要弄乱数组键。 V8根据数组键进行性能评估,并做了一些相当不错的假设,如果您进行修改,则会失去所有好处。

但是如果您不关心性能,则可以创建阵列的副本,并且引擎不会复制自定义键。

Object.keys([...v])

答案 2 :(得分:0)

您可以使用Array.from

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