JS 中建立自定義排序方法 可樂程式設計師的部落格

2022-09-23 02:39:07 字數 2262 閱讀 3437

為了保證的可讀性,本文採用意譯而非直譯。

一般情況咱們排序大都按數字或字母順序,但也有一些情況下,咱們可能需要自定義排序順序。

在此之前先簡單介紹一下 reduce 方法:

語法:arr.reduce(callback(accumulator, currentvalue[, index[, array]])[, initialvalue])

callback:執行陣列中每個值的函式,包含四個引數:

accumulator:累計器累計**的返回值; 它是上一次呼叫**時返回的累積值,或initialvalue(見於下方)。

currentvalue:陣列中正在處理的元素。

currentindex (可選):陣列中正在處理的當前元素的索引。如果提供了initialvalue,則起始索引號為0,否則為1。

array(可選): 呼叫 reduce() 的陣列

initialvalue(可選):作為第一次呼叫 callback 函式時的第乙個引數的值。如果沒有提供初始值,則將使用陣列中的第乙個元素。在沒有初始值的空陣列上呼叫 reduce 將報錯。

rudeuce 過程描述:

**函式第一次執行時,accumulator 和currentvalue的取值有兩種情況:如果呼叫reduce()時提供了initialvalue,accumulator取值為initialvalue,currentvalue取陣列中的第乙個值;如果沒有提供 initialvalue,那麼accumulator取陣列中的第乙個值,currentvalue取陣列中的第二個值。

回到原文:

如下面的例子所示,咱們想讓 inprogress 在第一位,接著是 todo,然後是 done。

const tasks = [

? ,? ,

? ,? ,

? 首先按照所需的排序順序建立乙個陣列。

const sortby = ['inprogress', 'todo', 'done']

使用reduce來建立乙個函式,引數為乙個陣列,最後輸出以陣列項為鍵,索引為值,如 。

const sortbyobject = data => data.reduce(

? (obj,item,index) => ( */

這樣就有了排序設定,咱們可以將它與乙個可重用的函式放在一起,該函式傳入乙個陣列(data)、乙個sortby陣列和乙個sortfield,這樣咱們就知道要在哪個欄位上排序:

const customsort = () => ))

這樣就可以按照咱們的自定義順序排序,不過還有乙個問題,如果列表中有乙個status不同的項(不在咱們的排序順序中),就會出現問題。因此,為了處理這個問題,咱們需要設定乙個預設的sort欄位來捕獲排序中不需要的所有項。

const taskswithdefault = tasks.map(item => (

? ? ...item,

? ? sortstatus: sortby.includes(item.status) ? item.status:'other'

這次傳遞的是更新後的sort欄位,那麼現在就有了正確的排序順序,列表底部還有包含狀態為 other 的專案。

完整**:

const tasks = [

? ,? ,

? ,? ,

? ,?

const sortby = ["inprogress", "todo", "done"];

const customsort = () => {

? const sortbyobject = sortby.reduce(

? ? (obj, item, index) => ({

? ? ? ...obj,

? ? ? [item]: index

? return data.sort(

? ? (a, b) => sortbyobject[a[sortfield]] - sortbyobject[b[sortfield]]

const taskswithdefault = tasks.map(item => ({

? ...item,

? sortstatus: sortby.includes(item.status) ? item.status : "other"

console.log(

? customsort({

? ? data: taskswithdefault,

? ? sortby: [...sortby, "other"],

? ? sortfield: "sortstatus"

執行結果:

JS 建立自定義物件的方法

優點 接受引數,可以無數次的呼叫這個函式,建立person物件,而每次他都可以返回乙個包含三個屬性乙個方法的物件。缺點 雖然解決了建立多個相似物件的問題,但是沒有解決物件識別的問題 即怎麼知道乙個物件的型別 js中可以建立自定義的建構函式,從而定義自定義物件屬性和方法。person 中的 和crea...

JS自定義方法

在c 中有delegate,還有特殊的可以直接應用於事件程式設計的delegate,那就是event。而在js中沒有c 的event,更沒有delegate,有的只是dom元素內建的的native的不可擴充套件的event,比如無法為input元素新增事件,只能在其擁有的事件 如onclick ha...

JS實現自定義排序

定義 用本地特定的順序來比較兩個字串。語法 stringobject.localecompare target 引數 target 要以本地特定的順序與 stringobject 進行比較的字串。返回值 說明比較結果的數字。1 如果 stringobject 小於 target,則 localeco...