说我们有这个
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)));
还有更好的方法吗?
答案 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);