2011-07-07 242 views
1

我有一个JavaScript数组:如何通过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 
    } 
} 
+1

你在寻找一个关联数组吗? – fncomp

+0

我看到你正在使用一个对象,但也想使用索引。正如@Edgar Villegas Alvarado所提到的,这不是本地特征。 – fncomp

回答

1

它看起来像你的事实,所有对象associative arrays混乱的JavaScript array objects。请注意,普通对象(例如,您提到的“Fruit”对象)没有属性(键)的内部排序,而Array对象(由于整数索引的自然排序)没有。本质上,数组只是一个具有特殊“长度”属性的对象,它存储最后一个整数索引(从零开始)加一。

任何对象的属性将在任意(例如随机的)顺序被重复:

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'... 
} 

这些差异意味着,不管你的“水果”的对象是如何定义的存在是为了确保密钥的严格排序(如“香蕉”没有可靠的方法,“苹果”,“色彩”,“大小”等),除非你自己保留自己的订单。

+0

好吧,这是好的,我可以得到“颜色”,“尺寸”和“成本”,我怎么才能得到他们的价值呢?像循环for循环或什么? – Craig

+0

@Craig:查看我更新的答案:尝试使用'obj [prop]'其中'prop'是'for ... in'循环中的迭代器变量。 – maerics

+0

明白了,谢谢! – Craig

2

我有点困惑,因为你似乎已经回答了你自己的问题。我也不知道你的阵列是如何设置的。但是,如果你在这个例子中看看,你可以看到它在这里工作:

http://jsfiddle.net/uyNnH/

这是假设顶层数组包含了你的水果类型和第二级阵列包含每个水果类型的属性。

更新

Mozillaothers

在JavaScript 1.0,你可以通过他们的财产 姓名或者序号索引指向一个 对象的属性。在 的JavaScript 1.1或更高版本,但是,如果 您最初由其 名称定义属性,必须始终引用它由 它的名字,如果你最初定义 通过索引的属性,必须 总是指它由它的索引。

所以问题是你声明一个关联数组,而不是基于索引/序数的数组。我能想到的唯一解决方案是使用(丑陋)for循环。下面是一些未经测试的伪代码:

function getItemByIndex(index, array) { 
    var counter = 0; 

    for (item in array) 
    { 
     if (counter == index) 
     { 
      return item; 
     } 

     counter++; 
    } 
} 
+0

我想能够使用这两种方法来获取值。 但是Fruit [0] [0]不起作用。 – Craig

+0

我看到...有没有简单的方法来做到这一点..但我会修改我的答案。 – Kon

+0

我想这个数组看起来像: Fruit = [Banana => [Color =>'Yellow',Size =>'Large',Cost =>'$ 3.50'],Apple => [Color =>'Green',大小=>'小',成本=>'$ 0.42']]; – Craig

1

不能除非您在字符串的索引复制到数字指标,但他们将新元素的数组

0

你不要在并不表示你如何创建你的数组或者分配这些值,但是这听起来像你不知道JavaScript数组和JavaScript对象之间的区别。

一个对象具有键属性为字符串的属性,但不能通过索引整数仅通过键访问这些属性。

数组是提供像length属性和一些方法,如sort()等阵列性质通常与数字索引分配阵列功能的特殊类型的对象,并且length属性基于那些数字索引属性,但因为数组仍然是对象,您还可以使用字符串键指定属性。如果您说myArray['banana'] = ..“香蕉”属性无法通过索引编号访问。

如果你想要像'banana'这样的键,你根本不应该使用数组,只需使用一个普通的对象。

有很多文章更深入地解释这一点;这里有一个我发现随机:http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/

+0

我在php(数组数组)中创建数组,然后使用json_encode并将其发送给javascript,所以我想我有一个对象。 – Craig

+0

啊。 PHP数组和JS数组不遵循相同的约定。 – nnnnnn

相关问题