【问题标题】:Sort an array with arrays in it by string按字符串对包含数组的数组进行排序
【发布时间】:2011-07-23 01:21:11
【问题描述】:

我有一个包含多个数组的数组,我想根据这些数组中的某个字符串对数组进行排序。

var myArray = [
                [1, 'alfred', '...'],
                [23, 'berta', '...'],
                [2, 'zimmermann', '...'],
                [4, 'albert', '...'],
              ];

如何按名称对其进行排序,以便 albert 排在第一位,zimmermann 排在最后?

如果我可以使用整数进行排序,我知道该怎么做,但字符串让我一无所知。

感谢您的帮助! :)

【问题讨论】:

标签: javascript arrays sorting


【解决方案1】:

这可以通过将支持函数作为参数传递给Array.sort 方法调用来实现。

类似这样的:

 function Comparator(a, b) {
   if (a[1] < b[1]) return -1;
   if (a[1] > b[1]) return 1;
   return 0;
 }

 var myArray = [
   [1, 'alfred', '...'],
   [23, 'berta', '...'],
   [2, 'zimmermann', '...'],
   [4, 'albert', '...'],
 ];

 myArray = myArray.sort(Comparator);
 console.log(myArray);

【讨论】:

  • 谢谢马丁,它工作得很好。但是,我遇到了小写名称的问题,它们的排序方式与以相同大写字母开头的名称不同。
  • 在这种情况下,请在 Comparator 方法中使用字符串的 toUpperCase 方法(a[1].toUpperCase() 和 b[1].toUpperCase)。这将使排序不区分大小写
  • OT,但在许多语言(Perl、Ruby、PHP 等)中,都有一个“宇宙飞船运算符”,它本机比较并返回 -1、0 或 1(根据您的 Comparator 方法)。以 ES 复制想法的速度,我预计它很快就会登陆 Babel。
【解决方案2】:

您仍然可以将array.sort() 与自定义函数一起使用。在函数内部,只需比较要用作键的元素。例如,您可以使用:

myArray.sort(function(a, b) { 
    return a[1] > b[1] ? 1 : -1;
});

【讨论】:

  • 我想你忘了return
  • 这不处理相等的字符串(即,它不返回 -1、1 或 0。@Martin Milan 的回复更好
  • @Aleadam 从理论上讲,您是正确的。比较器不在要求的规格范围内。但是,在实践中,如果您不关心在排序算法期间交换具有相同键的元素,这已经足够了。对于大型数组,此解决方案最终可能会变慢 - 取决于 array.sort() 的实现。但我至少需要返回 1 或 -1。编辑答案。
  • 因此,如果您需要在相等的情况下保留元素:return a[1] == b[1] ? 0 : (a[1] &gt; b[1] ? 1 : -1);
【解决方案3】:

现在有一种更简单的方法:

myArray = myArray.sort(function(a, b) {
    return a[1].localeCompare(b[1]);
})

它也不区分大小写。

来源:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare

【讨论】:

  • "在对象中找不到函数 localeCompare"
  • 你的数组元素必须是字符串,而不是对象
  • 是的,我尝试将数字转换为字符串,但结果仍然很混乱。 stackoverflow.com/questions/33004116/…
【解决方案4】:

在 ES6 中,可能会做的相对简洁:

myArray.sort(([a], [b]) => a.localeCompare(b))

myArray.sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)

有用/现代的位是 =&gt; lambda 运算符和 [X] 参数解构。

【讨论】:

    【解决方案5】:

    太棒了!第一个元素、第二个元素和第三个元素的复合排序,在这个例子中都是升序的,将是

    myArray=myArray.sort(function(a,b){
        retVal=0;
        if(a[0]!=b[0]) retVal=a[0]>b[0]?1:-1;
        else if(a[1]!=b[1]) retVal=a[1]>b[1]?1:-1;
        else if(a[2]!=b[2]) retVal=a[2]>b[2]?1:-1;
        return retVal
    });
    

    (对多列进行多重排序)

    【讨论】:

      【解决方案6】:

      不断收到此处发布的解决方案的问题。对于数组中简单字符串的简单排序器,我使用了这个:

      arr = ["aaa","abc","aba"]
      arr.sort((a, b) => a.localeCompare(b));
      console.log(arr);
      //['aaa','aba','abc']
      

      【讨论】:

        猜你喜欢
        • 2020-02-18
        • 2019-05-26
        • 2011-03-07
        • 1970-01-01
        • 2015-07-07
        • 1970-01-01
        • 2020-09-04
        • 2016-07-02
        相关资源
        最近更新 更多