簡體   English   中英

JS:按順序對數組的一部分進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM