如何在ie9中禁用数组自动排序

时间:2011-10-13 00:32:47

标签: javascript

我有一个javascript数组(ary),我需要打印出每个元素作为该数组中的select选项。

我在代码进入循环之前发现 - 对于(var i in ary),数组ary已在IE9中自动排序,但在其他浏览器中,这不会发生。 我不希望我的数组在IE9中排序,有没有办法在IE9中禁用自动排序?

ary数组是一个对象填充数组,它从php数组转换为javascript数组。我不太熟悉javascript,但我试着用(var i = 0; i

在for(in)循环中,我使用document.write(i)打印出每个元素,我可以看到在ie9和chrome中,结果在firefox中排序,结果不是排序(这是我想要的)。

以下是代码

for (var i in ary) {
        selected = false;
        if (optional && !blank && (ary[i][valuef] == '')) {
            blank = true;
        }
        if (typeof(value) == 'object') {
            for (var j in value) {
                if (optional && !blank && (value[j] == '')) {
                    blank_selected = true;
                }
                if (ary[i][valuef] == value[j]) {
                    selected = true;
                    break;
                }
            }
        } else if (ary[i][valuef] == value) {
            selected = true;
        }
        if (selected) {
            output += '<option value="' + ary[i][valuef] +'" selected="selected">' + ary[i][namef] + '</option>';
        } else {
            output += '<option value="' + ary[i][valuef] +'">' + ary[i][namef] + '</option>';
        }
    }
    if (optional && !blank) {
        if (blank_selected) {
            output = '<option value="" selected></option>' + output;
        } else {
            output = '<option value=""></option>' + output;
        }
    }
    return output;
}

4 个答案:

答案 0 :(得分:4)

使用for循环迭代数组,而不是for ( in )

for (var i = 0, length = arr.length; i < length; i++) { ... }

后者用于迭代Object属性。当使用Array迭代for (in)时,顺序是特定于实现的(因为Object属性没有定义的顺序),这在迭代{{1}时没有意义}}

答案 1 :(得分:1)

数组只是具有特殊长度属性的对象和一些方便的方法。数组的索引只是具有数字名称的属性。如果您使用for..in迭代属性,您将获得所有可枚举属性,而不仅仅是数字属性,它们将以实现相关顺序返回。

某些浏览器可能按字母顺序返回属性,其他浏览器按数字顺序返回,其他浏览器可能按照添加顺序返回属性。如果删除并重新添加属性,有些将保留订单,其他将更改订单。

获得一致性的唯一方法是使用计数器访问数字属性,例如:

var i, length = array.length;
for (i = 0; i < length; i++) {
  // do something with array[i]
}

答案 2 :(得分:1)

数组不会自行排序,但是当您使用for(xx in yy)方法从IE9中的数组中提取数据时,IE9会按排序顺序为您提供键。所有其他浏览器(包括IE8)按照您将它们插入数组的顺序为您提供密钥。

因此,如上所述,解决方法是改为:

for (var i=0; i < arrayName.length; i++) {
  <do something>
}

这将按照插入数组的顺序将元素拉出数组。

答案 3 :(得分:0)

我会在混合物中添加替代解决方案。毫无歉意地,它是一个巨大的丑陋黑客,但却解决了一个问题。

如果您有一个名为'theArray'的数组,就像这样

100 => 'a'
200 => 'b'
300 => 'c'

然后替换

for (key in theArray)

for (var i=0; i < theArray.length; i++)

并没有什么帮助,因为长度是'3',但是你的密钥远远高于数组长度。据推测,这种情况下的密钥具有重要意义,您希望保留它们。

修复它的hackish方法是强制JavaScript将键视为字符串,而不是整数。你可以做一些快速而又脏的事情,比如将所有密钥重命名为

"a100" => 'a'
"a200" => 'b'
"a300" => 'c'

如果您希望稍后在代码中使用键值,则使用某种子字符串函数。

一旦将键视为字符串,我所知道的所有浏览器都会按创建顺序显示它们,而不是以任何其他顺序显示。

我应该添加免责声明 - 最好不要使用密钥作为以这种方式传送信息的方式来编写代码以避免这种情况。

例如:

0 => array (100,'a')
1 => array (200,'b')

这个hack是我用来快速修复的东西,我不想重写很多代码而不使用'有意义'的整数作为键。