当前位置:  开发笔记 > 编程语言 > 正文

Javascript数组长度在对象数组上不正确

如何解决《Javascript数组长度在对象数组上不正确》经验,为你挑选了3个好方法。

有人可以解释这个(奇怪的)行为吗?为什么第一个例子中的长度为3而不是2,最重要的是,为什么第二个例子中的长度为0?只要键是数字的,长度就有效.如果不是,则长度为0.如何从第二个示例中获得正确的长度?谢谢.

a = [];
a["1"] = {"string1":"string","string2":"string"};
a["2"] = {"string1":"string","string2":"string"};
alert(a.length); // returns 3

b = [];
b["key1"] = {"string1":"string","string2":"string"};
b["key2"] = {"string1":"string","string2":"string"};
alert(b.length); // returns 0

The Code Pim.. 91

需要注意的一点是,常规数组和关联数组之间存在差异.在常规数组(实数组)中,索引必须是整数.另一方面,关联数组可以使用字符串作为索引.如果您愿意,可以将关联数组视为地图.现在,还要注意,真正的数组总是从零开始.因此,在您的示例中,您以下列方式创建了一个数组:

a = [];
a["1"] = {"string1":"string","string2":"string"};
a["2"] = {"string1":"string","string2":"string"}

Javascript能够将您的字符串索引转换为数字,因此,您的上述代码变为:

a = [];
a[1] = {"blah"};
a[2] = {"blah"};

但请记住我之前所说的:真正的数组从零开始.因此,javascript解释器自动将[0]分配给undefined.在firebug或chrome/safari控制台中尝试一下,当你尝试打印"a"时,你会看到类似的东西.您应该得到类似"[undefined,Object,Object]"的内容.因此,大小3不是您预期的2.

在您的第二个示例中,我非常确定您正在尝试模拟关联数组的使用,这主要是向对象添加属性.记住关联的数组使您可以使用字符串作为键.因此,换句话说,您正在向对象添加属性.所以在你的例子中:

b["key1"] = {"string1":"string","string2":"string"};

这真的意味着:

b.key1 = {"string1":"string","string2":"string"};

初始化b = []只是创建一个数组,但是你的赋值不会填充数组.它只是给出了"b"额外的属性.希望这可以帮助.. :-)



1> The Code Pim..:

需要注意的一点是,常规数组和关联数组之间存在差异.在常规数组(实数组)中,索引必须是整数.另一方面,关联数组可以使用字符串作为索引.如果您愿意,可以将关联数组视为地图.现在,还要注意,真正的数组总是从零开始.因此,在您的示例中,您以下列方式创建了一个数组:

a = [];
a["1"] = {"string1":"string","string2":"string"};
a["2"] = {"string1":"string","string2":"string"}

Javascript能够将您的字符串索引转换为数字,因此,您的上述代码变为:

a = [];
a[1] = {"blah"};
a[2] = {"blah"};

但请记住我之前所说的:真正的数组从零开始.因此,javascript解释器自动将[0]分配给undefined.在firebug或chrome/safari控制台中尝试一下,当你尝试打印"a"时,你会看到类似的东西.您应该得到类似"[undefined,Object,Object]"的内容.因此,大小3不是您预期的2.

在您的第二个示例中,我非常确定您正在尝试模拟关联数组的使用,这主要是向对象添加属性.记住关联的数组使您可以使用字符串作为键.因此,换句话说,您正在向对象添加属性.所以在你的例子中:

b["key1"] = {"string1":"string","string2":"string"};

这真的意味着:

b.key1 = {"string1":"string","string2":"string"};

初始化b = []只是创建一个数组,但是你的赋值不会填充数组.它只是给出了"b"额外的属性.希望这可以帮助.. :-)


+1用于解释常见的误解.关联数组根本不是数组,它们只是复杂的对象
`Object.size = function(obj){var size = 0,key; for(key in obj){if(obj.hasOwnProperty(key))size ++; 返回大小; 这将获得数组/对象的实际大小.所以你可以调用Object.size(yourArray),无论你的索引在哪里开始,或者键是字符串,它都会给你大小.

2> Itay Maman..:

length返回1 +对象中最大的整数键.

a最大的键是2所以1 + 2是3.

b没有整数键(键有,key1并且key2不能转换为整数),所以Javascript假设最大的键是-1,并且1 + -1产生0.

该程序将帮助您了解:

a = [];
a["1"] = {};
a["4"] = {};
alert(a.length); // Prints 5



3> outis..:

根据ECMAScript标准,ECMA-262,第5版.

15.4.5.2长度

此Array对象的length属性是一个data属性,其值始终在数字上大于名称为数组索引的每个deletable属性的名称.

注意数组的length属性只考虑数组索引,它们是整数; 设置其他属性不会影响长度.

对于数组,a["3"]等同于a[3](此行为由第15.4.5.1节指定); 3是数组索引而不是属性.因此,设置a["3"]会影响数组的长度.b["key1"]相当于b.key1.设置属性不会影响集合的长度.

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有