我有一个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
}
}
答案 0 :(得分:3)
我有点困惑,因为你似乎回答了自己的问题。我也不知道你的数组是如何设置的。但是如果你看看这个例子,你可以看到它在这里工作:
这假设顶级数组包含水果类型,第二级数组包含每个水果类型的属性。
更新:
在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/