在javascript中计算数组的元素数

时间:2016-09-08 18:05:15

标签: javascript

请考虑以下事项:

var answers = [];

answers[71] = {
    field: 'value'
};

answers[31] = {
    field: 'value'
};

console.log(answers);

这会将数组的长度输出为 72 ,但我希望它返回 2 。这是来自chrome console的脚本输出:

enter image description here

为什么会这样?

6 个答案:

答案 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;