2017-05-18 1 views
2

Sortierung mit Priorität in jquery oder js

var data = [{ 
 
    "type": "local", 
 
    "name": "Frank", 
 
    "age": 89 
 
}, { 
 
    "type": "visitor", 
 
    "name": "Mary", 
 
    "age": 76 
 
}, { 
 
    "type": "local", 
 
    "name": "John", 
 
    "age": 36 
 
}, { 
 
    "type": "visitor", 
 
    "name": "James", 
 
    "age": 10 
 
}, { 
 
    "type": "local", 
 
    "name": "Lily", 
 
    "age": 17 
 
}, { 
 
    "type": "visitor", 
 
    "name": "Harry", 
 
    "age": 67 
 
}, { 
 
    "type": "local", 
 
    "name": "Larry", 
 
    "age": 7 
 
}, { 
 
    "type": "visitor", 
 
    "name": "Harold", 
 
    "age": 37 
 
}] 
 

 
var sort_by = function(field, reverse, primer) { 
 

 
    var key = primer ? 
 
    function(x) { 
 
     return primer(x[field]) 
 
    } : 
 
    function(x) { 
 
     return x[field] 
 
    }; 
 

 
    reverse = !reverse ? 1 : -1; 
 

 
    return function(a, b) { 
 
    return a = key(a), b = key(b), reverse * ((a > b) - (b > a)); 
 
    } 
 
} 
 

 

 
data = data.sort(sort_by('age', true, parseFloat)); 
 
console.log(JSON.stringify(data))

Das ist mein ist, wie ich meine Daten sortieren. Derzeit sortiert es das Alter von den ältesten bis zu den jüngsten. Es geht gut, wie es ist. Ich habe diese Sortierung in einem Post in SO gefunden.

Ich möchte eine weitere Anforderung an den Prozess hinzufügen. Ich will zuerst in der Lage sein, alle mit dem Typ lokal zu finden, sortiere es vom ältesten zum jüngsten , was alle lokalen zuerst vom ältesten zum jüngsten dann nach der Sortierung alle lokalen .. Sort den Rest vom ältesten zum jüngsten noch bedeutet.

UPDATE:

Es wird eine andere Art, aber es tut hier wichtig, weil Alles was ich brauche ist es, zunächst die lokale alle zunächst in der Liste zu machen, aber immer noch in der ältesten bis zur jüngsten und dann der Rest ist noch in ältesten zu den Jüngsten.

+0

Verwenden 'filter()' 'vor dem Aufruf von sort()': 'data.filter (d => d.type == 'local') sort (...' –

+0

wie tun Sie. mag es die Sortierreihenfolge aufsteigend zu ändern, sollten die Einheimischen auch zuerst kommen? –

+0

@RoryMcCrossan, wenn ich Filter verwendete, entfernte es die anderen Arten, die ich nicht will, dass ich nur lokal in der ersten Liste im ältesten bis jüngsten machen will dann wird der Rest am ältesten zum jüngsten sein – Giant

Antwort

4

Grundsätzlich müssen Sie überprüfen, ob type gleich 'local' ist, dann muss das Element nach oben verschoben werden. Dies geschieht durch eine Prüfung und ein Delta des Vergleichs.

Zum Beispiel

        cb-ca 
    a  b check a check b result comment 
----- ----- ------- ------- ------ ------------------ 
local local  true  true  0 take b.age - a.age 
local other  true false  -1 move a to top 
other local false  true  1 move a to bottom 
other other false false  0 take b.age - a.age 
data.sort(function (a, b) { 
    return (b.type === 'local') - (a.type === 'local') || b.age - a.age; 
}); 

var data = [{ type: "local", name: "Frank", age: 89 }, { type: "visitor", name: "Mary", age: 76 }, { type: "local", name: "John", age: 36 }, { type: "visitor", name: "James", age: 10 }, { type: "local", name: "Lily", age: 17 }, { type: "visitor", name: "Harry", age: 67 }, { type: "local", name: "Larry", age: 7 }, { type: "visitor", name: "Harold", age: 37 }], 
 
    sort_by = function(field, reverse, primer) { 
 
     var key = primer ? 
 
       function(x) { return primer(x[field]); } : 
 
       function(x) { return x[field]; }; 
 

 
     reverse = !reverse ? 1 : -1; 
 

 
     return function(a, b) { 
 
      return (b.type === 'local') - (a.type === 'local') || reverse * (key(a) - key(b)); 
 
     }; 
 
    }; 
 

 
data.sort(sort_by('age', true, parseFloat)); 
 
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

was ich will ist alles lokal zu gehen, aber in der ältesten zu jüngsten und dann Ruhe sollte immer noch am ältesten zu jüngsten gibt es einen anderen Typ neben lokalen und Besucher, aber es ist egal, solange alle lokalen zuerst in ältesten zu Jüngste dann der Rest älteste bis jüngste – Giant

+0

können Sie ein bisschen Erklärung hinzufügen, so dass ich verstehen kann, was es getan hat, seit Sie den Code total ändern .. das wäre hilfreich für mich und andere Leser – Giant

+0

können Sie bitte Erklärung hinzufügen, verstehe ich immer noch nicht aber Ich werde es als Antwort ticken – Giant

0

Ich weiß, es ist eine Art stummen aussieht, aber es funktioniert für mich ok ...

https://jsfiddle.net/wuhduhren/vcyvwq4k/5/

function sort(data){ 
    var personNotLocal = []; 
    var sortedData = []; 
    var sortedCleanData = []; 

    for (var i = 0; i < data.length; i++) { 
     var personalData = data[i]; 
    if (personalData["type"] == 'local'){ 
     sortedData.push([personalData['age'], personalData]); 
     sortedData.sort(function(a,b){return a[1] - b[1]}); //sort by age 
    } else { 
     personNotLocal.push([personalData['age'], personalData]); 
     personNotLocal.sort(function(a,b){return a[1] - b[1]}); //sort by age 
    } 
    } 
    sortedData.push.apply(sortedData, personNotLocal); //append personNotLocal array after sortedData 

    for (var i = 0; i < sortedData.length; i++) { 
    sortedCleanData.push(sortedData[i][1]); 
    } 
    return sortedCleanData; 
} 

var data = [{ 
    "type": "local", 
    "name": "Frank", 
    "age": 89 
}, { 
    "type": "visitor", 
    "name": "Mary", 
    "age": 76 
}, { 
    "type": "local", 
    "name": "John", 
    "age": 36 
}, { 
    "type": "visitor", 
    "name": "James", 
    "age": 10 
}, { 
    "type": "local", 
    "name": "Lily", 
    "age": 17 
}, { 
    "type": "visitor", 
    "name": "Harry", 
    "age": 67 
}, { 
    "type": "local", 
    "name": "Larry", 
    "age": 7 
}, { 
    "type": "visitor", 
    "name": "Harold", 
    "age": 37 
}]; 


console.log(JSON.stringify(sort(data), null, 2)); 
Verwandte Themen