如何根据长度对字符串的二维数组进行排序?

4

我有一个二维数组,想要按照字符串长度排序。请问应该如何操作?以下是我的代码:

arr = [['ab',0],['ax',0],['ac',0],['bsd',0],['ad',0],['asd',0],['bd',0],['ay',0]];
function sortByLen(a,b){
   return (a[0] < b[0]) ? -1 : 1;
}
arr.sort(sortByLen);
console.log(arr);

我希望您能按照以下顺序进行操作:

将它变为这个顺序

["ab", 0]
["ac", 0]
["ad", 0]
["ax", 0]
["ay", 0]
["bd", 0]
["asd", 0]
["bsd", 0]

我该如何做呢?

4个回答

1
这是您想要实现的吗?

var arr = [['ab',0],['ax',0],['ac',0],['bsd',0],['ad',0],['asd',0],['bd',0],['ay',0]];

var sorted = arr.sort(function(a,b) {
  return a > b
  }).sort(function(a,b) {
     return a[0].length - b[0].length
  })

console.log('sorted',sorted)


双重排序有些过头了,因为第二个排序并不尊重第一个排序。 - Nina Scholz
第二种排序是应用于按字母顺序排序的数组上。虽然我的答案更易读,但你的答案性能更好! - Brr Switch
并不是真的,因为Array#sort不稳定,另一种排序会破坏上一次排序。 - Nina Scholz

1
你可以使用带有回调函数的单一排序,该函数将考虑内部数组的第一个项目的长度差异。如果长度相等,则使用 String#localeCompare 按字母顺序排序。

var array = [['ab', 0], ['ax', 0], ['ac', 0], ['bsd', 0], ['ad', 0], ['asd', 0], ['bd', 0], ['ay', 0]];

array.sort(function (a, b) {
    return a[0].length - b[0].length || a[0].localeCompare(b[0]);
});

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }


0

检查长度是否不同。如果不同,则按长度排序。如果相等,则按字母顺序排序:

var arr = [['ab',0],['ax',0],['ac',0],['bsd',0],['ad',0],['asd',0],['bd',0],['ay',0]];
function sortByLen(a,b){
   if(a[0].length < b[0].length) return -1;
   if(a[0].length > b[0].length) return 1;
   if(a[0] < b[0]) return -1;
   if(a[0] > b[0]) return 1;
   return 0;
}
arr.sort(sortByLen);
console.log(arr);

0

试试这个

arr = [['ac',0],['ab',0],['ax',0],['bsd',0],['ad',0],['asd',0],['bd',0],['ay',0]];

const sortedItems = arr
  .sort((a, b) => a[0] > b[0])
  .sort((a, b) => a[0].length > b[0].length)

console.log(sortedItems)


双重排序有些过头了,因为第二个排序并不尊重第一个排序。 - Nina Scholz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接