2017-10-17 261 views
0

我需要的,如下圖所示,以我的數據通過一個特定的順序進行排序。JS排序特定的排序順序

const sortBy = ['b','a','c','e','d'] 
const data = ['a','d','e'] 

我知道如何asscending排序/降序

console.log(data.sort((a, b) => a > b)) //["a", "d", "e"] 
console.log(data.sort((a, b) => a < b)) //["e", "d", "a"] 

但使用.sort以特定的順序來排序這可能嗎? 例如低於我想要的順序是sortBy

我目前通過在我的排序數組和我的數據之間創建一個常用項目數組來獲得這個工作。

const commonItems = getCommonItemsInArrays(sortBy,data) 
console.log(commonItems.map(item => item)) //["a", "e", "d"] 

function getCommonItemsInArrays(array1,array2){ 
    return array1.filter(n => array2.indexOf(n) >= 0) 
} 

這似乎是工作好,但我不知道是否有辦法通過sort來處理呢?

+2

*「我知道如何asscending排序/降」 * - 你確定嗎?排序回調不應該返回一個布爾值......總之,都是'data'物品,保證是'sortBy'陣列? – nnnnnn

回答

4

.sort()回調可以做任何它需要做找出任何給定的項目是否應該是之前或任何其他特定項目後。因此,它可以查找當前項目的索引你sortBy陣列內並進行相應處理:

const sortBy = ['b','a','c','e','d'] 
 
const data = ['a','d','e'] 
 

 
console.log(data.sort((a,b) => sortBy.indexOf(a) - sortBy.indexOf(b)))

排序時調用.indexOf()多次將是一種低效的,所以你可能想把你sortBy成一個對象,然後再開始:

const sortBy = ['b','a','c','e','d'] 
 
const data = ['a','d','e'] 
 

 
const sortByObject = sortBy.reduce((a,c,i) => { 
 
    a[c] = i 
 
    return a 
 
}, {}) 
 

 
console.log(data.sort((a,b) => sortByObject[a] - sortByObject[b]))

(請注意,排序回調不應該返回一個布爾值。)

+0

我在想這是一個非常人爲的例子。您的解決方案類型的作品:你在傳遞值不就行了,像[ 'T', 'A', 'd', 'P', 'E']。您的代碼將返回[「t」,「a」,「e」,「d」]。如果你傳入[「t」,「a」,「d」,「p」,「e」],你會得到同樣的結果! –

+0

沒有排序順序爲A,E,D所以最初的測試成功, –

+0

@RobertMoskal - 如果要進行排序數組包含不屬於'sortBy'數組中的值,那麼我認爲應該通過定義排序的結果是未定義,但結果仍然會有相同數量的數組中的項目。但正如我在第一句話中所說的那樣,您需要對排序回調進行編碼,以便爲您的排序規則執行所需的任何操作。該任擇議定書並沒有說什麼,爲不'sortBy'值做的,但你可以添加一個if/else或任何默認回字母排序爲未知值。 – nnnnnn