2016-09-15 11 views
0

Ich habe ein Array von Objekten mit mehreren Eigenschaften. Angesichts die folgende Anordnung:JavaScript - Sortierung Array von Objekten, durch eine Eigenschaft basierend auf einer speziellen Reihenfolge

var people = [ 
     {name: "allen", age: 33, color:"green"}, 
     {name: "jon", age: 23, color:"blonde"}, 
     {name: "silver", age: 54, color:"yellow"}, 
     {name: "james", age: 52, color:"grey"}, 
     {name: "flint", age: 25, color:"pink"}, 
     {name: "beilly", age: 31, color:"blonde"}, 
     {name: "bwones", age: 47, color:"grey"}, 
     {name: "sas", age: 35, color:"green"}, 
     {name: "jackson", age: 234, color:"yellow"}, 
     {name: "leonsardo", age: 12, color:"brown"}, 
     {name: "dicaeprio", age: 73, color:"pink"}, 
     {name: "sylvfester", age: 35, color:"blonde"}, 
     {name: "alleen2", age: 33, color:"green"}, 
     {name: "jofn2", age: 23, color:"blonde"}, 
     {name: "sdilver2", age: 54, color:"yellow"}, 
     {name: "jamaes2", age: 52, color:"grey"} 
    ]; 

Ich brauche dieses Array zu sortieren, indem color Eigenschaft, aber in besonderer Weise, die zuerst von green, dann durch yellow, dann durch brown dann durch pink, dann grey und schließlich durch blonde. Ich lese here und here, aber ich habe es schwer, einen Kompaktor basierend auf meinen Bedürfnissen zu generieren. Da dies nur ein Demo-Array ist und meine realen Daten ein viel größeres Array sein werden, sollte der Sortiermechanismus schneller sein alsn^2.

+0

was 'grey'? –

+0

Über grau vergessen, ich werde meine Frage bearbeiten. Grau sollte vor "blond" stehen. – undroid

Antwort

7

Hier ist Ihr Komparator

var sortOrder = {green: 0, yellow: 1, brown: 2, pink: 3, grey: 4, blonde: 5}; 

people.sort(function (p1, p2) { 
    return sortOrder[p1.color] - sortOrder[p2.color]; 
}); 
+1

Ja! Sie können einfach param :) – Liberateur

+1

Einfach und einfach. Fantastisch. –

2

Ich schlage vor, als auch einen Standardwert zu verwenden, für die Sortierung, je nachdem, wo der nicht kotierten Farbe sortiert werden soll.

In diesem Fall müssen die Eigenschaften des Sortierreihenfolgeobjekts mit einem Wert über Null beginnen.

colorOrder = { green: 1, yellow: 2, brown: 3, pink: 4, grey: 5, blonde: 6 }; 

people.sort(function (a, b) { 
    return (colorOrder[a.color] || 0) - (colorOrder[b.color] || 0); 
}); 
1

Verwenden Andrey Methode, fügen Sie einfach ein param in Ihrem Objekt:

var sortOrder = {green: 0, yellow: 1, brown: 2, pink: 3, grey: 4, blonde: 5}; 

people.sort(function (p1, p2) { 
    return sortOrder[p1.color] - sortOrder[p2.color]; 
}); 

Oder , wenn Sie wirklich nicht, dass verwenden können, erstellen Sie Ihre Sortierfunktion:

var people = 
[ 
    {name: "allen", age: 33, color:"green"}, 
    {name: "jon", age: 23, color:"blonde"}, 
    {name: "silver", age: 54, color:"yellow"}, 
    {name: "james", age: 52, color:"grey"}, 
    {name: "flint", age: 25, color:"pink"}, 
    {name: "beilly", age: 31, color:"blonde"}, 
    {name: "bwones", age: 47, color:"grey"}, 
    {name: "sas", age: 35, color:"green"}, 
    {name: "jackson", age: 234, color:"yellow"}, 
    {name: "leonsardo", age: 12, color:"brown"}, 
    {name: "dicaeprio", age: 73, color:"pink"}, 
    {name: "sylvfester", age: 35, color:"blonde"}, 
    {name: "alleen2", age: 33, color:"green"}, 
    {name: "jofn2", age: 23, color:"blonde"}, 
    {name: "sdilver2", age: 54, color:"yellow"}, 
    {name: "jamaes2", age: 52, color:"grey"} 
]; 

var order = ['green','yellow','brown','pink','grey','blonde']; 
function mySort(array) 
{ 
    var list = []; 
    function getElem(array,id) 
    { 
     for(var i in array) if(array[i].color == id) list.push(array[i]) 
    } 

    for(var i in order) getElem(array,order[i]); 
    return list; 
} 

mySort(people); 
1

Ich denke, die richtige Art, diesen Job zu machen, ist ein Hash und Sortierung, aber ohne Verwendung von sort könnte der folgende Code genauso gut effizient sein.

var people = [ 
 
     {name: "allen", age: 33, color:"green"}, 
 
     {name: "jon", age: 23, color:"blonde"}, 
 
     {name: "silver", age: 54, color:"yellow"}, 
 
     {name: "james", age: 52, color:"grey"}, 
 
     {name: "flint", age: 25, color:"pink"}, 
 
     {name: "beilly", age: 31, color:"blonde"}, 
 
     {name: "bwones", age: 47, color:"grey"}, 
 
     {name: "sas", age: 35, color:"green"}, 
 
     {name: "jackson", age: 234, color:"yellow"}, 
 
     {name: "leonsardo", age: 12, color:"brown"}, 
 
     {name: "dicaeprio", age: 73, color:"pink"}, 
 
     {name: "sylvfester", age: 35, color:"blonde"}, 
 
     {name: "alleen2", age: 33, color:"green"}, 
 
     {name: "jofn2", age: 23, color:"blonde"}, 
 
     {name: "sdilver2", age: 54, color:"yellow"}, 
 
     {name: "jamaes2", age: 52, color:"grey"} 
 
    ], 
 
    arrays = [green, yellow, brown, pink, grey, blonde] = [[],[],[],[],[],[]], 
 
    result = []; 
 
    Object.keys(people).forEach(k => this[people[k].color].push(people[k])); 
 
    result = arrays.reduce((p,c) => p.concat(c)); 
 
console.log(result);

Für eine verbesserte Leistung, die Sie die letzte Zeile ersetzen könnte mit

result = arrays.reduce((p,c) => (Array.prototype.push.apply(p,c),p)); 
Verwandte Themen