Javascript-用可变长度的数组排序

问题描述 投票:1回答:2

假设我有一个按多个分数排序的选项数组,而这些分数是可变长度的数组

[
  #[Label, scores]
  ["Label6", [1]
  ["Label5", [1,5]
  ["Label2", [0,1,3,5],
  ["Label1", [0,1,2]
  ["Label3", [0,1,4],
  ["Label4", [1,4]
]

我想通过逐一评估数组元素对列表进行排序。 IE浏览器我将首先按score[0]排序(升序),然后按score[i+1]如果存在,以此类推。当score[i]不存在时,应将其视为一个无穷大的值(显示在底部)

这可以在以前的数据上提供以下输出:

list = [
  #[Label, scores]
  ["Label1", [0,1,2]  
  ["Label2", [0,1,3,5],
  ["Label3", [0,1,4],
  ["Label4", [1,4]
  ["Label5", [1,5]
  ["Label6", [1]
]

如何编写此函数?是否像我们在其他语言中一样具有本机/ ES6(或lodash /下划线)sortBy()函数? (例如,在Ruby中,您只需单击list.sort_by(&:last)即可获得此效果)。还是需要手动实施?

javascript arrays sorting
2个回答
5
投票

您可以采用数组,并按相同的索引值排序。

如果相同索引的两个值的增量不为零,则返回增量,否则继续下一个索引。

如果所有索引都没有前一个返回就被访问,则所有值都是相同的,直到两个数组的最小Inegth为止。在这种情况下,应按切入顺序返回两者长度的差值,因为较长的数组应排在首位。

var array = [["Label6", [1, 5]], ["Label2", [0, 1, 3, 5]], ["Label1", [0, 1, 2]], ["Label3", [0, 1, 4]], ["Label5", [1, 5, 2]], ["Label4", [1, 4]]];

array.sort(([, a], [, b]) => {
    var delta,
        index = 0,
        length = Math.min(a.length, b.length);

    while (index < length) {
        delta = a[index] - b[index];
        if (delta) return delta;
        index++;
    }

    return b.length - a.length;
});

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

0
投票

array.sort()函数,该函数采用排序算法,并根据该算法为您排序数组。您要做的就是仅对2个参数实施排序。

这是您的情况:

list.sort( list1, list2 => {
  let i = 0, iterations = min(list1.length, list2.length);
  for( i = 0; i<iterations; i++ ){
    if( list1[i] < list2[i] ) return -1;
    if( list1[i] > list2[i] ) return 1;
  }
  if( list1.length === list2.length ) return 0;
  if( i === list1.length ) return -1;
  if( i === list2.length ) return 1;
}

0
投票

array.sort()函数,该函数采用排序算法,并根据该算法为您排序数组。您要做的就是仅对2个参数实施排序。

这是您的情况:

list.sort( list1, list2 => {
  let i = 0, iterations = min(list1.length, list2.length);
  for( i = 0; i<iterations; i++ ){
    if( list1[i] < list2[i] ) return -1;
    if( list1[i] > list2[i] ) return 1;
  }
  if( list1.length === list2.length ) return 0;
  if( i === list1.length ) return -1;
  if( i === list2.length ) return 1;
}
© www.soinside.com 2019 - 2024. All rights reserved.