按键排序数组或:为什么我的for循环执行无序

Sort array by key OR: Why is my for loop executing out of order?

本文关键字:for 我的 循环 执行 无序 为什么 排序 数组      更新时间:2023-09-26

我有一个对象数组,我需要根据一些配置数据将其按一定顺序放置。我有一个问题,通过迭代数组在适当的顺序。我认为,如果我创建了数组,然后使用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
}

这应该会给我一个像这样的数组:

//var printOrder[undefined,foo,bar,a_shrubbery,foobar]

但是当我尝试遍历数组时:

    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]);
    }

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

我需要按键值对这个数组进行排序,或者按正确的顺序逐步进行。

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

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

使用"for…in"形式的语句不会让你得到可预测的顺序,正如你所看到的,它也可能有其他奇怪的效果(特别是当你混合在JavaScript框架或工具库或其他)。它用于遍历对象的属性名,并且不会对Array实例进行特殊处理。

您需要创建一个函数来查找数组中的值,如下所示:

Array.prototype.indexOf = function(value)
{
    var i = this.length;
    while ( i-- )
    {
            if ( this[ i ] == value ) return i;
    }
    return -1;
};

你可以这样使用它:

//NOTICE: We're looping through LINKS not ORDER
for ( var i = 0; i < links.length; i++ )
{
    var index = order.indexOf( i );
    //It's in the order array
    if ( index != -1 ) printOrder[ i ] = links[ i ];
}

记住:你需要确保json返回的值是整数。如果它们是字符串,那么在传递给indexOf时需要将整数转换为字符串。

你的问题的功能,你建议它应该工作。

http://jsfiddle.net/NRP2D/8/。

很明显,在这个简化的例子中,你已经删除了你在实际情况中所犯的任何错误。