2016-11-11 2 views
2

いいえ、特定のプロパティのnull値を含むオブジェクトの配列があります。null値を持つ複数の基準によるオブジェクトの配列の並べ替え

このオブジェクトはソート目的でほぼ同じように見えますが(40要素ですが、これで十分です)。

roulette降順でソートする必要があります(rouletteがnullの場合もあります)。次にnovelty、次にpopularityです。

私の頭がちょっと粉砕しています。

rouletteを降順で並べ替えることはできますが、他の2つの条件を含めるにはどのように拡張する必要がありますか?

オブジェクト:

[ 
{ 
    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のattrbuteです。 – 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

'b'が左にあるべきではありませんか?そうでなければ、それはかなり滑らかな解決策です。 – Ouroborus

+0

{ルーレット:ヌル}のルーレットと{ルーレット:未定義}のルーレットはどちらも真ですので、ルーレットが一切設定されていないと、それらは常に真実になります。 – Ouroborus

+1

データから「ヌル」または「未定義」で設定されていれば、オブジェクトの内部ではまったくではありません。 –

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

あなただけの1つのパラメータが同じであれば破壊絆に維持する必要があります。

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;}

関連する問題