JavaScript数组.length返回0

4
我有一个 JavaScript 数组,长这样:enter image description here 问题在于 Object.mappings 有 3 个元素,在控制台用 console.log() 明显打印出来了,但是当我尝试查找数组的长度时,它返回 0。我尝试将数组字符串化,结果只打印出 "[]"。
我做错了什么?

3
你能发布实际的代码吗?那会更有帮助。 - senschen
4
这是一个带有属性的数组,数组项使用整数键,因此该数组不包含任何项。 - Hacketo
5
请看这个类似的问题:https://dev59.com/vXE85IYBdhLWcg3w9odJ - henrikmerlander
如何将元素添加到数组中?可能可以使用其他方式获得您的“length”,例如使用 Object.keys(object.mapping).forEach(do something) - The Reason
看起来更像是一个对象。 - John
3个回答

5

只有当数组包含与索引相关联的元素时,才能使用length属性。如果它是关联数组,则length属性将返回0。您可以使用以下代码自行计算元素:

function len(arr) {
  var count = 0;
  for (var k in arr) {
    if (arr.hasOwnProperty(k)) {
      count++;
    }
  }
  return count;
}

然后,您可以使用len(mappings)来计算“mappings”数组的元素数量。

3

JavaScript数组与PHP中的关联数组不同。然而,由于JavaScript的动态特性以及Array是Object的子类,您仍然可以在Array上附加任意属性。但是,length属性不会反映这一点(正如您已经发现的那样)。

如果您正在使用较新的浏览器/ polyfills(例如core-js),我建议改用Map(文档)。否则,请使用简单对象({}),并在对象上使用Object.keys获取键。

后者的示例:

var mappings = {};
mappings['foo'] = 'bar';
Object.keys(mappings); // returns ['foo']
mappings[Object.keys(mappings)[0]]; // returns 'bar'

// Loop through all key-value pairs
Object.keys(mappings).forEach(function(key) {
  var value = mappings[key];
  // Do stuff with key and value.
});

3
根据 MDN的文章,数组的length属性表示一个整数,该整数大于数组中的最高索引

length属性表示一个无符号32位整数,始终比数组中的最高索引数字要大。

当您将非整数键分配给数组时,最高索引仍然是0

var arr = [];
arr['abc'] = 1;
console.log(arr.length); //0
arr[100] = 2;
console.log(arr.length); //101

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接