假设我有一个按多个分数排序的选项数组,而这些分数是可变长度的数组
[
#[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)
即可获得此效果)。还是需要手动实施?
您可以采用数组,并按相同的索引值排序。
如果相同索引的两个值的增量不为零,则返回增量,否则继续下一个索引。
如果所有索引都没有前一个返回就被访问,则所有值都是相同的,直到两个数组的最小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; }
有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;
}
有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;
}