如何在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
    }
}

看起来您将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/

相关内容

  • 没有找到相关文章

最新更新