[英]Javascript - sort by with arrays of variable length
假設我有一個按多個分數排序的選項數組,並且這些分數是一個可變長度的數組
[
#[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]
不存在時,應該認為是無限值(出現在底部)
這可以在先前的數據上給出以下 output :
list = [
#[Label, scores]
["Label1", [0,1,2]
["Label2", [0,1,3,5],
["Label3", [0,1,4],
["Label4", [1,4]
["Label5", [1,5]
["Label6", [1]
]
我該如何寫這個 function? 是否有像我們在其他語言中一樣的本機/ES6(或 lodash/下划線) sortBy()
function? (例如在 Ruby 中,您只需list.sort_by(&:last)
即可獲得此效果)。 還是需要手動實現?
您可以使用 arrays,並按相同的索引值排序。
在開始時將 arrays 的最小長度作為迭代值的長度並防止采用undefined
。
如果同一索引的兩個值的 delta 不為零,則返回 delta,否則繼續下一個索引。
如果訪問了所有索引而沒有先前的返回,則同一索引處的所有值都相等,直到 arrays 的最小長度。 在這種情況下,以切換順序返回兩者長度的增量,因為較長的數組應該排在第一位。
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()
function,它采用排序算法並根據該算法對數組進行排序。 您所要做的就是僅對 2 個 arguments 進行排序。
這是我在你的情況下會做的:
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.