2016-11-11 44 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;}