假设我们有这个:
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);