[英]JS: Sort a part of an array by order
我的任務是按從另一個數組給出的特定順序對隨機數數組進行排序。 所有其他無法排序的元素都應該放在結果數組的末尾:
const array = [6,1,2,3,4,5]
const sortOrder = [3,2,1]
const shouldSortTo = [3,2,1,6,4,5]
我有以下解決方案:
array.sort((a,b)=> {
if(sortOrder.indexOf(a) === -1 && sortOrder.indexOf(b) > -1 ) {
return 1
}
if(sortOrder.indexOf(a) > -1 && sortOrder.indexOf(b) === -1 ) {
return -1
}
return sortOrder.indexOf(a) - sortOrder.indexOf(b)
})
它有效,但我覺得它不容易閱讀或理解。 有更好或更短的方法嗎?
並不是說這更好或更有效,但您可以首先檢查所有 sortOrder 項是否都在數組中,然后從數組中刪除 sortOrder 項並將兩者連接起來:
const array = [6,1,2,3,4,5] const sortOrder = [3,2,1] const shouldSortTo = [3,2,1,6,4,5] let result = sortOrder.filter(s => array.includes(s)).concat(array.filter(i =>.sortOrder.includes(i))) console.log(result)
我不會繼續查找索引。 只需閱讀一次並使用它。 您可以將其應用於您自己的代碼。
const array = [6,1,2,3,4,5] const sortOrder = [3,2,1] array.sort((a,b)=> { const aI = sortOrder.indexOf(a); const bI = sortOrder.indexOf(b); if (aI === -1 && bI > -1 ) return 1; else if (aI > -1 && bI === -1 ) return -1; return aI - bI; }) console.log(array);
我會檢查它們是否相等並返回零。 我會檢查是否為-1。 最后我會根據索引進行排序。
const array = [6,1,2,3,4,5] const sortOrder = [3,2,1] array.sort((a,b)=> { const aI = sortOrder.indexOf(a); const bI = sortOrder.indexOf(b); if (aI === bI) return 0; else if (aI === -1) return 1; else if (bI === -1) return -1; else return aI - bI; }) console.log(array);
其他選項,如果 -1,設置為數組的長度並減去
const array = [6,1,2,3,4,5] const sortOrder = [3,2,1] const max = array.length; array.sort((a,b)=> { const aI = sortOrder.indexOf(a); const bI = sortOrder.indexOf(b); return (aI === -1? max: aI) - (bI === -1? max: bI); }) console.log(array);
或者您可以保留邏輯
const array = [6,1,2,3,4,5] const sortOrder = [3,2,1] const max = array.length; const reversed = sortOrder.slice().reverse(); array.sort((a,b)=> { const aI = max - reversed.indexOf(a); const bI = max - reversed.indexOf(b); return aI - bI; }) console.log(array);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.