有一个JavaScript数组:
Fruit > Banana > Colour > Yellow
> Size > Large
> Cost > $3.50
> Apple > Colour > Green
> Size > Small
> Cost > $0.42
我可以得到值使用:
alert(Fruit['Banana']['Colour']);
如何使用索引获得相同的值?。
alert(Fruit[0][0]);
谢谢大家给我指明了正确的方向,这是我想要的解决方案:
for (var a in Fruit) {
//var a gives me "Banana" and "Apple"
for (var b in Fruit[a]){
//var b gives me "Colour", "Size" and "Cost"
//Fruit[a][b] gives me the values
}
}
看起来您将JavaScript数组对象与所有对象都是关联数组的事实混淆了。请注意,普通对象(例如你提到的"Fruit"对象)没有属性(键)的内在顺序,而数组对象有(由于整数索引的自然顺序)。从本质上讲,Array只是一个具有特殊"length"属性的对象,用于存储最后一个整数索引(从0开始)加1。
任何对象的属性都将以任意(例如random)顺序迭代:
var obj = {a:'Aye', b:'Bee', c:'See', d:'Dee'};
for (var prop in obj) {
alert(prop + '=' + obj[prop]); // No order is guaranteed.
}
严格地说,即使是数组也不能保证使用for-in
循环以自然顺序迭代;然而,大多数JavaScript解释器都会这样做。(值得注意的是,IE8按照索引分配的顺序迭代,而不是自然顺序。)这就是为什么你总是应该在一个普通的"for"循环中使用索引来迭代数组。
var arr = ['a', 'b', 'c', 'd', 'e', 'f'];
for (var i=0; i<arr.length; i++) { // i = [0 .. length-1]
alert(arr + '=' + arr[i]); // Explicitly order as 'a', 'b', 'c'...
}
这些差异意味着,无论你的"Fruit"对象是如何定义的,都没有可靠的方法来确保键的严格顺序(例如:"香蕉","苹果","颜色","大小"等),除非您单独保留自己的排序。
我有点困惑,因为你似乎已经回答了你自己的问题。我也不知道你是如何设置数组的。但是如果你看一下这个例子,你可以看到它在这里工作:
http://jsfiddle.net/uyNnH/假设顶层数组包含水果类型,第二层数组包含每种水果类型的属性。
:
来自Mozilla和其他:
在JavaScript 1.0中,你可以引用对象的属性名称或按其序数索引。在JavaScript 1.1或更高版本您最初通过其定义属性名字,你必须总是提到它它的名字,如果你最初定义属性通过索引,您必须始终通过索引来引用它。
所以问题是你声明了一个关联数组,而不是一个基于索引/序数的数组。我能想到的唯一解决方案是使用(丑陋的)for
循环。下面是一些未经测试的伪代码:
function getItemByIndex(index, array) {
var counter = 0;
for (item in array)
{
if (counter == index)
{
return item;
}
counter++;
}
}
您不能, 除非您将字符串索引复制到数字索引,但它们将是数组中的新元素
您没有说明如何创建数组或分配这些值,但听起来您好像不知道JavaScript数组和JavaScript对象之间的区别。
一个对象的属性的键是字符串,但是你不能用索引整数来访问这些属性,只能通过键来访问。
数组是一种特殊类型的对象,它提供了数组功能,如length
属性和一些方法,如sort()
等。数组属性通常是用数字索引赋值的,length
属性是基于那些数字索引的属性,但是由于数组仍然是对象,您也可以用字符串键赋值属性。如果你说myArray['banana'] = ..
, 'banana'属性不能通过索引号访问。
如果你想要像'banana'这样的键,你根本不应该使用数组,只需要使用普通对象。
有很多文章更深入地解释了这一点;下面是我随机找到的一个:http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/