2016-12-12 109 views
2

我想這個數組對象由它的布爾屬性排序不過,我在努力尋找與JavaScript的「排序」解決方法如何通過它的布爾屬性進行排序對象數組

我試圖對它進行排序,因此數組中的頂部項目將是'offer = true',然後是'shortlisted = true',最後是'rejected = true'。

var toSort = [{ 
    offer: false, 
    shortlisted: true, 
    rejected: false, 
    stage: 2 
}, { 
    offer: false, 
    shortlisted: false, 
    rejected: true, 
    stage: null 
}, { 
    offer: true, 
    shortlisted: true, 
    rejected: false, 
    stage: null 
}, { 
    offer: false, 
    shortlisted: true, 
    rejected: false, 
    stage: 1 
}]; 

這是最後的結果,我想實現

[{ 
    offer: true, 
    shortlisted: true, 
    rejected: false, 
    stage: null 
}, { 
    offer: false, 
    shortlisted: true, 
    rejected: false, 
    stage: 1 
}, { 
    offer: false, 
    shortlisted: true, 
    rejected: false, 
    stage: 2 
}, { 
    offer: false, 
    shortlisted: false, 
    rejected: true, 
    stage: null 
}] 

什麼是排序這個數組的最佳方法是什麼?

+0

如何通過布爾值對此進行排序屬性?你可以說得更詳細點嗎? –

+0

你有什麼嘗試?它是如何失敗的?你想如何排序數組? –

+0

哪個字段被排序? – WillardSolutions

回答

5

您可以像這樣使用sort()

var toSort = [{ 
 
    offer: false, 
 
    shortlisted: true, 
 
    rejected: false, 
 
    stage: 2 
 
}, { 
 
    offer: false, 
 
    shortlisted: false, 
 
    rejected: true, 
 
    stage: null 
 
}, { 
 
    offer: true, 
 
    shortlisted: true, 
 
    rejected: false, 
 
    stage: null 
 
}, { 
 
    offer: false, 
 
    shortlisted: true, 
 
    rejected: false, 
 
    stage: 1 
 
}]; 
 

 
var result = toSort.sort(function(a, b) { 
 
    return b.offer - a.offer || 
 
    b.shortlisted - a.shortlisted || 
 
    b.rejected - a.rejected 
 
}) 
 

 
console.log(result)

0

的一種方式是指定一個數字計分給每個對象,設置更高的分數爲更高的優先級的值。例如:

var scoreObj = function(o) { 
     var score = 0; 
     if(o.offer) { 
      score+=100; 
     } 
     if(o.shortlisted) { 
      score+=10; 
     } 
     if(o.rejected) { 
      score+=1; 
     } 
     return score; 
    }; 
    var sorted = toSort.sort(function(a,b){ 
     return scoreObj(b) - scoreObj(a); 
    }); 
0

一個簡單的方法:

toSort.sort(function(a, b){ 
    var numberA = a.offer * 5 + a.shortlisted * 3 + a.rejected; 
    var numberB = b.offer * 5 + b.shortlisted * 3 + b.rejected; 
    return numberA < numberB 
}); 

爲什麼這個工程:

1),我們可以把布爾爲0或1,因此,如果a.offer是真的,我們正在增加5至numberA,如果不爲0

2)如果提供屬性爲true,即使所有的都爲真,報價仍然會出現第一個(因爲5> 1 + 3 = 4)

對於超過3個屬性:通過這種方式,我們優先考慮您想要的布爾屬性,方法是給它一個大於所有優先級較低屬性總和的數字值

+0

那麼,爲什麼不4和2而不是5和3 ..?這將使我對二進制感覺.. [Nenad的答案](http://stackoverflow.com/a/41105161/4543207)雖然似乎更好。 – Redu

+0

@Reed確實4和2會工作,我也相信其他答案更好;) – juvian

相關問題