问题是Object.mappings
有3个元素在console.log()
的控制台中清晰打印,但当我尝试查找数组的长度时,它返回0
。我尝试对数组进行字符串化,然后只打印“[]”。
我在这里做错了什么?
答案 0 :(得分:3)
仅当数组包含与索引关联的元素时,才可以使用length属性。如果它是关联数组,则length属性将返回0.您可以使用以下代码自行计算元素:
function len(arr) {
var count = 0;
for (var k in arr) {
if (arr.hasOwnProperty(k)) {
count++;
}
}
return count;
}
然后,您可以使用len(mappings)
答案 1 :(得分:2)
JavaScript数组不像PHP那样可以作为关联数组使用。但是,由于JavaScript的动态特性以及Array是Object的子类这一事实,您仍然可以将任意属性附加到Array上。但是length
属性不会反映这一点(正如您所发现的那样)。
如果您使用较新的浏览器/ polyfill(如core-js
),我建议改为使用Map
(Documentation)。否则,使用一个简单的对象({}
),并在对象上使用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.
});
答案 2 :(得分:1)
在这篇MDN文章中,数组的length
属性表示的数字大于数组中最高索引的整数。
length属性表示无符号的32位整数,它始终在数值上大于数组中的最高索引。
当您为数组指定非整数键时,最高索引仍为0
。
var arr = [];
arr['abc'] = 1;
console.log(arr.length); //0
arr[100] = 2;
console.log(arr.length); //101