2017-03-02 26 views
-2

所以,我有對象的數組,我有我需要冠軍corporate_sponsor和所有權的優先級進行排序,然後visitor_bureau和標題,然後休息2個布爾值。排序3倍的值

let array = [{ 
    "title": "A Some Place", 
    "visitor_bureau": "0", 
    "corporate_sponsor" : "0" 
    }, { 
    "title": "B Some Place", 
    "visitor_bureau": "1", 
    "corporate_sponsor": "1" 
    }, { 
    "title": "C Some Place", 
    "visitor_bureau": "1", 
    "corporate_sponsor" : "1" 
}]; 

我現在使用的代碼只設置爲對visitor_bureau和title進行排序,但我需要添加另一個元素。

var sorted = array.sort((a, b) => b.visitor_bureau - a.visitor_bureau || a.title.localeCompare(b.title)); 

任何幫助將不勝感激。

+0

因此添加它,你已經有一個模板可循。 –

+0

謝謝你的減號。試圖學習新的東西,我得到一個減號。其中一些對每個人來說可能都不那麼容易。 –

回答

1

如果你能想像自己不得不在未來增加更多的屬性,它會更有意義,以創建一個抽象通過任何你需要的屬性,而不是每次增加自己的方法進行排序(使它更加複雜,不太可讀)。

我已經定義了一個函數sorterBy,你可以通過表示要排序每個屬性陣列的順序,按照優先順序。它返回一個函數,可用作Array#sort的參數。使用它看起來像這樣(其中「排序」是1的上升和-1降序):

let sorted = [...array].sort(sorterBy(
//[<name>, <type>, <sort order>] 
    ['corporate_sponsor', 'number', -1], 
    ['visitor_bureau', 'number', -1], 
    ['title', 'string', 1] 
)) 

function sorterBy (...properties) { 
 
    return (a, b) => { 
 
    let result = 0 
 
    for (let property of properties) { 
 
     if (result) return result 
 
     else result = compare(a, b, property) 
 
    } 
 
    return result 
 
    } 
 
} 
 

 
function compare(a, b, property) { 
 
    let [name, type, direction = 1] = property 
 
    a = a[name] 
 
    b = b[name] 
 
    if (direction === -1) [b, a] = [a, b] 
 
    switch (type) { 
 
    case 'number': 
 
     a = +a 
 
     b = +b 
 
     return a < b ? -1 : a === b ? 0 : 1; 
 
    case 'string': 
 
     a += '' 
 
     b += '' 
 
     return a.localeCompare(b) 
 
    } 
 
    return 0 
 
} 
 

 

 
let array = [{ 
 
    "title": "A Some Place", 
 
    "visitor_bureau": "0", 
 
    "corporate_sponsor" : "0" 
 
    }, { 
 
    "title": "B Some Place", 
 
    "visitor_bureau": "1", 
 
    "corporate_sponsor": "1" 
 
    }, { 
 
    "title": "C Some Place", 
 
    "visitor_bureau": "1", 
 
    "corporate_sponsor" : "1" 
 
}] 
 

 
let sorted = [...array].sort(sorterBy(
 
    ['corporate_sponsor', 'number', -1], 
 
    ['visitor_bureau', 'number', -1], 
 
    ['title', 'string', 1] 
 
)) 
 

 
console.log(array) 
 
console.log(sorted)

0

我最後想出來的我自己。

var sorted = posts.sort((a, b) => b.corporate_sponsor - a.corporate_sponsor || b.visitor_bureau - a.visitor_bureau || a.title.localeCompare(b.title));