2016-11-11 45 views
2

好的,所以我有一個包含某個特定屬性的空值的對象數組。按空值排列多個條件的對象數組

該對象大致類似於這種排序目的...(40個元素,但這就足夠了...)。

它需要根據roulette降序排列(有roulette有時爲空),然後novelty,然後popularity

我的腦袋變得有點癟了。

這可以按降序對roulette進行排序,但是如何將其擴展爲包含其他兩個標準?

對象:

[ 
{ 
    title: 'one', 
    popularity: 4, 
    novelty: 3 
}, 
{ 
    title: 'two', 
    popularity: 1 
    novelty: 4 
}, 
{ 
    title: 'three', 
    popularity: 5, 
    novelty: 3, 
    roulette: 0 
}, 
{ 
    title: 'four', 
    popularity: 5, 
    novelty: 3, 
    roulette: 1 
} 
] 

部分工作職能:

object.sort(function(a, b) { 
    if (a['roulette'] == null) return 1 
    if (b['roulette'] == null) return -1 
    if (a['roulette'] === b['roulette']) return 0 
    return b.roulette > a.roulette ? 1 : -1 
    }); 
+0

請添加更多的數據和想要的結果。我很抱歉,我無法閱讀什麼新奇的排序方式。 –

+0

@NinaScholz新奇在他的json中是一個特徵。 – Sikorski

+0

是的,我讀過這個,但是'null'應該放在哪裏? –

回答

2

嘗試按優先級和組進行排序。

var data = [{ title: 'one', popularity: 4, novelty: 3 }, { title: 'two', popularity: 1, novelty: 4 }, { title: 'three', popularity: 5, novelty: 3, roulette: 0 }, { title: 'four', popularity: 5, novelty: 3, roulette: 1 }, { title: 'five', popularity: 5, novelty: 4, roulette: null }, { title: 'six', popularity: 5, novelty: 5, roulette: undefined }]; 
 

 
data.sort(function (a, b) { 
 
    return (
 
     (a.roulette === undefined || a.roulette === null) - (b.roulette === undefined || b.roulette === null) || 
 
     a.roulette - b.roulette || 
 
     a.novelty - b.novelty || 
 
     a.popularity - b.popularity 
 
    );  
 
}); 
 

 
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

不應該在左邊?否則,這是一個非常漂亮的解決方案。 – Ouroborus

+0

{roulette:null}中的''roulette''和{roulette:undefined}中的''roulette'都是真實的,所以這些將始終是真實的,除非根本沒有設置輪盤。 – Ouroborus

+1

從數據中不清楚,如果它設置爲null或undefined,根本不在對象內部。 –

0

你可以嘗試基於加權排名排序:

var data=[{title:"one",popularity:4,novelty:3},{title:"two",popularity:1,novelty:4},{title:"three",popularity:5,novelty:3,roulette:0},{title:"four",popularity:5,novelty:3,roulette:1}]; 
 

 
data.sort(function(a, b) { 
 
    var r1 = a.roulette === undefined ? -1 : a.roulette; 
 
    var r2 = b.roulette === undefined ? -1 : b.roulette; 
 
    var n1 = a.novelty === undefined ? -1 : a.novelty; 
 
    var n2 = b.novelty === undefined ? -1 : b.novelty; 
 
    var p1 = a.popularity === undefined ? -1 : a.popularity; 
 
    var p2 = b.popularity === undefined ? -1 : b.popularity; 
 

 
    var r_rank = r1 > r2 ? -100 : r1 < r2 ? 100 : 0; 
 
    var n_rank = n1 > n2 ? -10 : n1 < n2 ? 10 : 0; 
 
    var p_rank = p1 > p2 ? -1 : p1 < p2 ? 1 : 0; 
 

 
    return r_rank + n_rank + p_rank; 
 
}) 
 

 
var r_rank = r1 > r2 ? -100 : r1 < r2 ? 100 : 0; 
 
var n_rank = n1 > n2 ? -10 : n1 < n2 ? 10 : 0; 
 
var p_rank = p1 > p2 ? -1 : p1 < p2 ? 1 : 0; 
 
return r_rank + n_rank + p_rank; 
 
}) 
 

 
console.log(data)

0

就包括更多的條件語句:

var data = [{"title":"one","popularity":4,"novelty":3},{"title":"two","popularity":1,"novelty":4},{"title":"three","popularity":5,"novelty":3,"roulette":0},{"title":"four","popularity":5,"novelty":3,"roulette":1}]; 
 
data.sort(function(a,b) { 
 
    if (a.roulette < b.roulette || a.roulette == null) return +1; 
 
    if (a.roulette > b.roulette || b.roulette == null) return -1; 
 
    if (a.novelty < b.novelty || a.novelty == null) return +1; 
 
    if (a.novelty > b.novelty || b.novelty == null) return -1; 
 
    if (a.popularity < b.popularity || a.popularity == null) return +1; 
 
    if (a.popularity > b.popularity || b.popularity == null) return -1; 
 
    return 0; 
 
}) 
 
console.log(data);

+0

也許像'a.roulette Oriol

0

你只需要不斷突破的關係,如果一個參數是一樣的。

obj.sort(function(a, b) { 
    var rouletteDiff = compare(a.roulette, b.roulette); 
    if(rouletteDiff != 0) return rouletteDiff; 
    var noveltyDiff = compare(a.novelty, b.novelty); 
    if(noveltyDiff != 0) return noveltyDiff; 
    return compare(a.popularity, b.popularity); 
    }); 

    function compare(x,y){ 
    if(x == undefined) return 1; 
    if(y == undefined) return -1; 
    if(x === y){ 
     return 0; 
    }else{ 
     return x > y ? -1 : 1 
    } 
    } 
0

這裏是優先排序(降序)與roulettenoveltypopularity(按順序)

這種處理nullundefined - 看看下面的演示:

var object=[{title:"one",popularity:4,novelty:3},{title:"two",popularity:1,novelty:4},{title:"three",popularity:5,novelty:3,roulette:0},{title:"four",popularity:5,novelty:3,roulette:1},{title:"five",roulette:4,novelty:null},{title:"six",popuplarity:7},{title:"seven",novelty:8,roulette:null},{title:"eight",novelty:0},{title:"nine",popularity:10}]; 
 

 
function ifNumber(num) { 
 
    if(num == undefined || num == null) 
 
    return -Infinity; 
 
    else 
 
    return num; 
 
} 
 

 
var result = object.sort(function(a, b) { 
 
    return (ifNumber(b.roulette) - ifNumber(a.roulette)) 
 
     || (ifNumber(b.novelty) - ifNumber(a.novelty)) 
 
     || (ifNumber(b.popuplarity) - ifNumber(a.popuplarity)); 
 
}); 
 
console.log(result);
.as-console-wrapper{top:0;max-height:100%!important;}