為了保證的可讀性,本文採用意譯而非直譯。
一般情況咱們排序大都按數字或字母順序,但也有一些情況下,咱們可能需要自定義排序順序。
在此之前先簡單介紹一下 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...