2017-03-02 24 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));