我有一个数组定义为:
var subjectCache = [];
然后我有一些代码来构建它,这是正常的。
但是,如果我尝试通过索引引用数组,例如:
var x = subjectCache[0];
或
var x = subjectCache[1];
我得到undefined
。
此外subjectCache.length
始终为0(零)。
如果我试图用它的键引用它,例如:
var x = subjectCache['12345'];
它有效。
这是正常的吗?我不能用它的索引来引用它吗?
我正在使用Internet Explorer,如果它有所作为(它可能会:()
[编辑]
这是我用来构建阵列的代码,虽然我真的不认为这是责任。
它是来自网络服务电话的回调。这工作正常,阵列正在填充。
var subjectCache = [];
var subjectCacheCount = 0;
function refreshSubjectsCallback(data) {
// update subjects
// loop through retrieved subjects and add to cache
for( i=0; i < data.length; i++ )
{
var subject = data[i];
var subjectid = subject.SubjectId;
subjectCache[subjectid] = subject;
subjectCacheCount += 1;
}
}
[/编辑]
答案 0 :(得分:3)
您可能手动分配密钥而不是使用subjectCache.push()
向阵列添加新元素:
var array = [];
array['foo'] = 'bar';
console.log(array.length); // 0
length
属性不会以您期望的方式反映这些更改:
> var a = [];
undefined
> a[100] = 2; // The previous `100` entries evaluate to `undefined`
2
> a.length;
101
相反,请使用对象:
var object = {};
object['foo'] = 'bar';
for (var key in object) {
var value = object[key];
console.log(value);
}
答案 1 :(得分:0)
根据您的症状,听起来您正在尝试将数组视为关联数组。
在Javascript中,数组的工作方式如下:
var a = [];
a[1] = 10;
alert(a.length);
对象的工作原理如下:
var o = {};
o.myProp = true;
o["myOtherProp"] = false;
答案 2 :(得分:0)
数组只能使用数字键而非字符串。字符串为对象指定属性,不计入length
的一部分,也不计算数字索引。
构建数组时,请确保指定数组中的数字位置。
答案 3 :(得分:0)
不,它不起作用,因为你没有创建数组而是对象。 你必须通过它的密钥访问它。
var x = subjectCache['12345'];
如果这样做而且subjectCache.length
没有,我认为你正在制作对象而不是数组。你很困惑。
答案 4 :(得分:0)
在路上某处你丢失了数组,变量subjectCache
指向不同类型的对象。
如果它是一个数组,则它的长度不能为零,并且包含一个可以使用subjectCache['12345']
访问的项目。当您访问数组中的项目时,如果您使用数字索引或表示数字的字符串,则没有任何区别。