【问题标题】:javascript sort array double sortjavascript排序数组双重排序
【发布时间】:2012-05-01 20:21:04
【问题描述】:

我有一个数组 MyArrayOfItemsItem 对象,其对象如下所示:

Item
{
  ContainerID: i, // int
  ContainerName: 'SomeName', // string
  ItemID: j, // int
  ItemName: 'SomeOtherName' // string
}

我想对该数组进行排序,使其按ContainerID 排序,然后按字母顺序按ItemName 排序。

我有一个自定义排序函数,到目前为止看起来像这样:

function CustomSort(a, b) {

  Item1 = a['ContainerID'];
  Item2 = b['ContainerID'];

  return Item1 - Item2;
}

MyArrayOfItems.sort(CustomSort);

这按 ContainerID 排序,但我如何按 ItemName 排序?

谢谢。

【问题讨论】:

  • @FelixKling:不是真的;我需要它按字母顺序排序。
  • 所以?您可以轻松地将刺痛与<> 进行比较,尽管我同意localCompare 是更好的方法。我认为整体问题是关于如何按两个属性排序,在这种情况下它显然是重复的。

标签: javascript


【解决方案1】:

使用String.localeCompare 函数。并在ContainerIDab 相等时使用它。

function CustomSort(a, b) {
  var Item1 = a['ContainerID'];
  var Item2 = b['ContainerID'];
  if(Item1 != Item2){
      return (Item1 - Item2);
  }
  else{
      return (a.ItemName.localeCompare(b.ItemName));
  }
}

要调整排序顺序,您始终可以将- 放在任何return 表达式的前面。

【讨论】:

  • 应该的。就像它在非常古老的 JavaScript 1.2 中一样。
  • localcompare 是一个不错的选择,但我记得 chrome 有问题..code.google.com/p/v8/issues/detail?id=459
  • Item1 - Item2 !=0 可以简化为Item1 != Item2
  • 好的,谢谢菲利克斯;我把 Item1 !== Item2 设置为使用三元比较器。
【解决方案2】:
function CustomSort(a, b) {

  Item1 = a['ContainerID'];
  Item2 = b['ContainerID'];
  if(Item1 - Item2 !=0){
      return Item1 - Item2;
  }
  else{
      if (a.ItemName < b.ItemName)
         return -1;
      if (a.ItemName > b.ItemName)
         return 1;
      return 0;
  }
}

【讨论】:

  • 好的,谢谢;赞成,因为它也有效。不过我更喜欢 localeCompare。
【解决方案3】:

一个很好的简化是:

function CustomSort(a, b) {
  var Item1 = a['ContainerID'];
  var Item2 = b['ContainerID'];
  

 if(Item1 != Item2){
      return (Item1 - Item2);
  }
  else{
      return (a.ItemName.localeCompare(b.ItemName));
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 2017-03-27
    • 2013-03-23
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多