按字符串对包含数组的数组进行排序

IT技术 javascript arrays sorting
2021-01-25 23:44:15

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

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

我如何按名称对其进行排序,以便阿尔伯特排在第一位,齐默尔曼排在最后?

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

谢谢您帮忙!:)

6个回答

这可以通过将支持函数作为参数传递给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);

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

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

myArray.sort(function(a, b) { 
    return a[1] > b[1] ? 1 : -1;
});
@Aleadam 从理论上讲,您是对的。比较器不符合要求的规格。但是,在实践中,如果您不关心在排序算法期间交换具有相等键的元素,那么这种方法就足够了。对于大型数组,此解决方案最终可能会变慢 - 取决于 array.sort() 的实现。但我至少需要返回 1 或 -1。编辑答案。
2021-03-17 23:44:15
我想你忘记了 return
2021-03-20 23:44:15
所以如果你需要将元素留在原地,如果相等: return a[1] == b[1] ? 0 : (a[1] > b[1] ? 1 : -1);
2021-03-27 23:44:15
这不处理相等的字符串(即,它不返回 -1、1 或 0。@Martin Milan 的回复更好
2021-04-07 23:44:15

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

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

是的,我试过将数字转换为字符串,但结果仍然很混乱。stackoverflow.com/questions/33004116/...
2021-03-27 23:44:15
“在对象中找不到函数 localeCompare”
2021-03-29 23:44:15
您的数组元素必须是字符串,而不是对象
2021-04-08 23:44:15

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

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

或者

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

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

惊人的!对第一个元素、第二个元素和第三个元素进行复合排序,在本例中全部升序,将是

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

(对多于一列进行多重排序)