按键排序数组OR:为什么我的for循环执行乱序?

Chr*_*ski 2 javascript arrays for-loop

我有一个对象数组,我需要按照一定的顺序放置,具体取决于一些配置数据.我有一个问题,以正确的顺序itterating通过数组.我想如果我制作了数组,然后逐步执行for循环,我就能正确执行代码.除了一个用例之外,它工作得很好,我将第四个项添加到数组中,然后返回第三个项.

links[0] = foo
links[1] = bar
links[2] = foobar
links[3] = a_herring
links[4] = a_shrubery

order = [] //loaded from JSON, works has the numbers 1 2 3 or 4 as values
           //in this case:
order[0] = 1
order[1] = 2
order[2] = 4
order[3] = false
order[4] = 3

for(x in order){        
   if(order[x]){
    printOrder[order[x]]=links[x]
    //remember that in this case order[0] would
}
Run Code Online (Sandbox Code Playgroud)

这应该给我一个如下所示的数组:

//var printOrder[undefined,foo,bar,a_shrubbery,foobar]
Run Code Online (Sandbox Code Playgroud)

但是当我尝试通过数组进行迭代时:

    for(x in printOrder){
        printOrder[x].link.appendChild(printOrder[x].image)
        printOrder[x].appendChild(printOrder[x].link)
        printOrder[x].appendChild(printOrder[x].text)
        document.getElementById("myDiv").appendChild(printOrder[x]);
    }
Run Code Online (Sandbox Code Playgroud)

我得到foo, bar, foobar, a_shrubbery输出作为输出.

我需要按键值对此数组进行排序,或者按正确顺序逐步执行此操作.

Poi*_*nty 6

迭代数组实例的数字索引属性应始终使用数字索引:

for (var x = 0; x < printOrder.length; ++x) {
  // whatever with printOrder[x]
}
Run Code Online (Sandbox Code Playgroud)

正如您所见,使用语句的"for ... in"形式将无法获得可预测的排序,并且它也可能具有其他奇怪的效果(特别是当您混合使用JavaScript框架或工具库或其他任何内容时).它用于迭代对象的属性名称,并且不会特别处理Array实例.