2016-11-11 7 views
2

In Ordnung, also habe ich ein Array von Objekten, die Nullwerte für eine bestimmte Eigenschaft enthält.Sortieren eines Arrays von Objekten nach mehreren Kriterien mit Nullwerten

Das Objekt sieht ungefähr so ​​aus für Sortierzwecke ... (40 Elemente, aber das reicht ...).

braucht Es basiert auf roulette absteigend sortiert werden (mit roulette manchmal ist null), dann novelty, dann popularity.

Mein Kopf wird ein bisschen zerquetscht.

Das funktioniert, um die roulette in absteigend zu sortieren, aber wie muss ich es erweitern, um die anderen zwei Kriterien aufzunehmen?

Objekt:

[ 
{ 
    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 
} 
] 

Teilarbeitsfunktion:

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

Bitte fügen Sie weitere Daten und das gewünschte Ergebnis hinzu. Es tut mir leid, ich kann nicht lesen, was Neuerung beim Sortieren bedeutet. –

+0

@NinaScholz Neuheit ist ein Novum in seinem JSON. – Sikorski

+0

ja, ich lese das, aber wo sollte 'null' gehen? –

Antwort

2

Ein Versuch mit der Sortierung nach Priorität und Gruppen.

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

Sollten die 'b's nicht auf der linken Seite sein? Ansonsten ist das eine ziemlich glatte Lösung. – Ouroborus

+0

"roulette" in {roulette: null} 'und' 'roulette' in {roulette: undefined} 'sind wahr, so dass diese immer wahr werden, wenn 'roulette' nicht gesetzt wurde. – Ouroborus

+1

es ist nicht klar aus den Daten, wenn es mit 'null' oder 'undefined', überhaupt nicht innerhalb des Objekts festgelegt ist. –

0

Sie können versuchen, auf dem gewichteten Rang Sortierung basiert:

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

sind nur mehr conditionals:

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

Vielleicht etwas wie 'a.roulette Oriol

0

Sie müssen nur auf Bruch Beziehungen zu halten, wenn ein Parameter gleich ist.

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

Hier ist die bevorzugte Sortierung (absteigend) mit roulette, novelty und popularity (in dieser Reihenfolge)

Diese Griffe beidenull und undefined - überprüfen Sie die Demo aus unten :

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

Verwandte Themen