2013-06-30 96 views
17

請參閱編輯結束處的實際問題。按排序對象排序的布爾屬性

好吧,我有這樣的場景:

a = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] 

然後,如果我這樣做:

a.sort(function(a,b){return !a && b}); 

它給了我這樣的:

[false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false] 

它八九不離十做一個排序...但不完全... :(

如何對此數組進行排序?

編輯:

如果你想知道爲什麼我不只是a.sort(使用),是因爲我的實際數組的對象,而不是一個普通數組像我貼。真正的一個人,看起來像元素[{XX:真正},{XX:假},...]

+0

如果我做a.map(函數(X){返回X 1:0})排序(函數(一, b){return a> b});也不管用......我想我可能會做一些基本的錯誤 – PCoelho

+0

爲什麼你需要編寫自定義函數? a.sort()應該可以工作 –

回答

59

a = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]; 
 
    
 
    
 
    a.sort(function(x, y) { 
 
     // true values first 
 
     return (x === y)? 0 : x? -1 : 1; 
 
     // false values first 
 
     // return (x === y)? 0 : x? 1 : -1; 
 
    }); 
 
    
 
    console.log(a);

您必須返回0時,A和B都具有相同的值,如果a爲真則爲-1,否則爲1。

+1

是的,你知道了:)謝謝! (我會盡快接受你的答案,只要stackoverflow允許我:P) – PCoelho

+13

甚至更​​短:a.sort(函數(x,y){返回y - x}); –

+2

a.sort()怎麼樣?編輯:嘗試,工作! – dandavis

15

一個簡單的方法:

a = [{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false}]; 

a.sort(function(a,b){return a.xx-b.xx}); 

console.log(a); 

你可以調用a.reverse()排序(之後),如果你需要它有序的其他方式..

編輯: 編輯,以反映更新的問題排序一組對象而不是一組布爾值。

+0

是的,a.sort(),OP有什麼問題? –

+1

@PranavNegandhi:有什麼不對的是,我在編輯重新定義之前回答了問題... – dandavis

+0

無論如何更新了答案,所以人們可以剪切和粘貼測試... – dandavis

0

PFB的解決方案,打字稿角2以及工作對我來說,

let a = [{aa:"1",xx:true},{aa:"10",xx:false},{aa:"2",xx:true},{aa:"11",xx:false},{aa:"3",xx:true},{aa:"12",xx:false},{aa:"4",xx:true},{aa:"13",xx:false},{aa:"5",xx:true},{aa:"14",xx:false},{aa:"6",xx:true},{aa:"15",xx:false},{aa:"7",xx:true},{aa:"16",xx:false},{aa:"8",xx:true},{aa:"17",xx:false},{aa:"9",xx:true},{aa:"18",xx:false}]; 

    //a.sort(function(a,b){return a.xx-b.xx}); 
    a.sort(function (x, y) { 
     // true values first 
     return (x.xx === y.xx) ? 0 : x ? -1 : 1; 
     // false values first 
     // return (x === y)? 0 : x? 1 : -1; 
    }); 
    return JSON.stringify(a);