如何在JavaScript中通过索引引用数组项?

时间:2011-07-07 04:34:33

标签: javascript arrays multidimensional-array

我有一个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
    }
}

4 个答案:

答案 0 :(得分:3)

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

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++;
    }
}

答案 1 :(得分:2)

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

任何对象的属性都将以任意(例如随机)顺序迭代:

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”对象如何定义,都没有可靠的方法来确保密钥的严格排序(例如“Banana”,“Apple”,“Color”,“Size”等)。除非您单独保留自己的订购。

答案 2 :(得分:1)

不能除非将字符串索引复制到数字索引,但它们将是数组中的新元素

答案 3 :(得分:0)

您没有指明如何创建数组或指定这些值,但听起来您不知道JavaScript数组和JavaScript对象之间的区别。

对象具有属性,其键是字符串,但是您不能仅使用键来访问具有索引整数的属性。

数组是一种特殊类型的对象,它提供数组功能,如length属性和某些方法,如sort()等。数组属性通常分配有数字索引,{{1} }属性基于那些数字索引属性,但由于数组仍然是对象,您还可以使用字符串键分配属性。如果您说length无法通过索引编号访问'banana'属性。

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

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