请考虑以下事项:
var answers = [];
answers[71] = {
field: 'value'
};
answers[31] = {
field: 'value'
};
console.log(answers);
这会将数组的长度输出为 72 ,但我希望它返回 2 。这是来自chrome console的脚本输出:
为什么会这样?
答案 0 :(得分:16)
您可以使用Object.keys(array).length
计算实际的密钥数:
const answers = [];
answers[71] = {
field: 'value'
};
answers[31] = {
field: 'value'
};
console.log(Object.keys(answers).length); // prints 2
答案 1 :(得分:2)
通过定义索引71,您已告诉数组它需要至少保留72个条目,而您未明确定义的任何条目将保留undefined
的值。
要查找实际元素的数量,您可以遍历数组并检查每个元素是否为undefined
,并计算有多少元素不是undefined
答案 2 :(得分:1)
您可以使用Array#forEach
或使用Array#reduce
var answers = [], count = 0;
answers[71] = { field: 'value' };
answers[31] = { field: 'value' };
answers.forEach(_ => count++);
console.log(count);
console.log(answers.reduce(r => r + 1, 0));
答案 3 :(得分:1)
只需使用对象而不是数组并检查
Object.keys(your_object_like_array).length
获得金额。
答案 4 :(得分:1)
您只需使用 Array#filter
方法,该方法不会对已删除或未定义的数组元素进行迭代。
answers.filter(function(v){ return true; }).length
var answers = [];
answers[71] = {
field: 'value'
};
answers[31] = {
field: 'value'
};
console.log(answers.filter(function(v) {
return true;
}).length);

答案 5 :(得分:1)
为什么会这样?
因为这就是语言的运作方式。
来自MDN:
length
属性表示无符号的32位整数,总是在数值上大于数组中的最高索引。
来自spec:
具体来说,每当添加名称为数组索引的自有属性时,
length
属性的值将根据需要更改为该数组索引的数值< /强>;
请注意,长度始终大于最后一个填充项的索引。在你的情况下,如果你做了
answers[71] = {field: 'value'};
answers[31] = {field: 'value'};
长度现在是72,但如果你那么
delete answers[71];
长度将保持为72,不可以调低至32。
如果您的问题实际上是找到阵列中实际填充的插槽数,请参阅其他答案,或者您可以强制它,循环遍历所有索引并检查是否使用in
运营商:
let count = 0;
for (let i = 0; i < arr.length; i++) count += i in arr;