Array.length给出错误的长度

穆罕默德·塔哈·阿克巴尔

如果我有一个将对象作为值的数组,例如:

var a = [];
a[21] = {};
a[90] = {};
a[13] = {};
alert(a.length); // outputs 91

我找到了一种解决方法来获取实际长度:

function getLength(arr) {
    return Object.keys(arr).length;
}
var a = [];
a[21] = {};
a[90] = {};
a[13] = {};
alert(getLength(a));

但是,当对象以随机索引存储时,为什么JS的长度不正确?它只是在数组上找到的最大索引上加1。像上面的示例一样,90是最大的索引。它只加1并给出91作为输出。示范

杜沙尔

这是因为length为您index提供了阵列中的下一个

DOCS

arrayLength

如果传递给Array构造函数的唯一参数是0到2 ^ 32-1(含)之间的整数,则返回一个新的JavaScript数组,其长度设置为该数字。

ECMA规格

因为您没有在21、90、13之外的其他键中插入任何元素,所以其余所有索引都包含undefined演示

要获取数组中元素的实际数量:

var a = [];
a[21] = {};
a[90] = {};
a[13] = {};

var len = 0;

for (var i = 0; i < a.length; i++) {
  if (a[i] !== undefined) {
    len++;
  }
}
document.write(len);

短版

var a = [];
a[21] = {};
a[90] = {};
a[13] = {};


for (var i = 0, len = 0; i < a.length; i++, a[i] !== undefined && len++);


document.write(len);

演示

编辑

如果数组包含大量元素,则循环获取其长度不是最佳选择。

正如您在问题中提到的那样Object.keys(arr).length,考虑到没有在该数组上添加任何属性,在这种情况下是最好的解决方案。否则,length将不会是您所期望的。(感谢@RobG)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

新的Array(length)给出错误的大小

来自分类Dev

Array.equal() 给出错误的输出

来自分类Dev

为什么array_diff给出错误?

来自分类Dev

CodeIgniter:函数调用result_array()给出错误

来自分类Dev

新的数组(长度)给出错误的大小

来自分类Dev

$(select).val()。null的长度给出错误

来自分类Dev

在array_map中设置回调函数给出错误

来自分类Dev

仅将H:i:s转换为分钟,但array_map()给出错误

来自分类Dev

XSLT:字符串长度($变量)给出错误的答案

来自分类Dev

确定向量之间的长度会给出错误的结果

来自分类Dev

C ++ .length()函数给出错误的结果

来自分类Dev

给出错误DBD :: mysql :: st fetchrow_array失败:fetch()没有execute()仅用于DELETE语句

来自分类Dev

FindViewById给出错误

来自分类Dev

UIAlertController给出错误

来自分类Dev

CGIHTTPRequestHandler给出错误

来自分类Dev

Makefile给出错误

来自分类Dev

nlsLM给出错误:尝试使用零长度变量名-Black Scholes Model Fit

来自分类Dev

R 中的 Kruskal-wallis 测试给出错误:模型.frame.default 中的错误:变量长度不同

来自分类Dev

CGImageCreate迅速给出错误

来自分类Dev

IEqualityComparer给出错误的结果

来自分类Dev

npm开始给出错误

来自分类Dev

DateTime格式给出错误

来自分类Dev

marrangeGrob给出错误提示

来自分类Dev

filesize():给出错误的结果

来自分类Dev

FragmentTransaction的setCustomAnimation()给出错误

来自分类Dev

变量声明给出错误

来自分类Dev

NSNumber给出错误的值

来自分类Dev

appendChild给出错误,JavaScript

来自分类Dev

与TabHost的HorizontalScrollabe给出错误