【问题标题】:Sort array by key OR: Why is my for loop executing out of order?按键排序数组 OR:为什么我的 for 循环执行乱序?
【发布时间】:2011-09-01 20:21:19
【问题描述】:

我有一个对象数组,我需要根据某些配置数据按特定顺序放置这些对象。我在以正确的顺序遍历数组时遇到问题。我认为如果我创建了数组,然后使用 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 作为输出。

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

【问题讨论】:

    标签: javascript arrays for-loop


    【解决方案1】:

    遍历 Array 实例的数字索引属性应始终使用数字索引来完成:

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

    如您所见,使用“for ... in”形式的语句不会让您获得可预测的顺序,而且它还会产生其他奇怪的效果(特别是当您混合使用 JavaScript 框架或工具库或任何)。用于遍历对象的属性名,不特殊对待Array实例。

    【讨论】:

      【解决方案2】:

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

      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 时将整数转换为字符串。

      【讨论】:

        【解决方案3】:

        您在问题中的功能按照您的建议工作。

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

        显然,在这个简化的案例中,您已经消除了您在真实案例中所犯的任何错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-24
          • 1970-01-01
          • 2022-01-15
          • 2019-07-31
          • 1970-01-01
          相关资源
          最近更新 更多