2016-10-05 1 views
0

ich Ihre Hilfe für ein kleines algorithme für meine Anwendung benötigen:Unders sortBy Algorithmus

ich habe ein Objekt wie folgt:

var obj = { "response" : [ 
    "candidate" : { 
     "id":"1", 
     "price" : 10, 
     "distance" : 20 
    }, 
    "candidate" : { 
     "id":"2" 
     "price" : 14, 
     "distance" : 2 
    }, 
    "candidate" : { 
     "id":"3", 
     "price" : 200, 
     "distance" : 1 
    } 
] } 

die ich sortiert nach Preis wie folgt aus:

var sortPrice = _(obj.response).sortBy(function(p){ 
    return p.candidate.price 
}) 

Es funktioniert gut und sortieren Sie das Objekt (IDs): 1,2,3

Jetzt, wenn Kandidat hat den gleichen Preis, aber anders Abstand soll ich die ersten Kandidaten mit dem gleichen Preis zeigen und die niedrigste Entfernung:

var obj = { "response" : [ 
    "candidate" : { 
     "id":"1", 
     "price" : 10, 
     "distance" : 20 
    }, 
    "candidate" : { 
     "id":"2" 
     "price" : 10, 
     "distance" : 2 
    }, 
    "candidate" : { 
     "id":"3", 
     "price" : 200, 
     "distance" : 1 
    } 
] } 

var sorted = _(obj.response).chain().sortBy(function (p) { 
    return parseInt(p.candidate.price) ; 
}).sortBy(function(d){ 
    return parseInt(d.candidate.distance) 
}).value(); 

Aber es mir die niedrigsten Entfernung sortiert zuerst (ids): 3 (mit Abstand 1), 2 (mit Abstand 2), 1 (mit Abstand 20) als 2,1,3

Haben Sie einen Vorschlag?

Vielen Dank.

Antwort

0

Lodash ist ein Fork von Strich, die Sie durch mehrere Eigenschaften des Objekts sortieren können.

es verwenden, könnte eine Lösung sein:

_(obj.response).map(_.partial(_.get, _, 'candidate')).sortBy(['price', 'distance']).value(); 

Hier ist die fiddle falls Sie mit ihm spielen wollen.

+0

Vielen Dank für die Antwort, ich Verwenden Sie lodash nicht für jetzt, aber Ihr Code ist interessant. –

1

In reinem js können Sie sort() so verwenden.

var obj = { 
 
    "response": [{ 
 
    "candidate": { 
 
     "id": "1", 
 
     "price": 8, 
 
     "distance": 20 
 
    } 
 
    }, { 
 
    "candidate": { 
 
     "id": "2", 
 
     "price": 8, 
 
     "distance": 2 
 
    } 
 
    }, { 
 
    "candidate": { 
 
     "id": "3", 
 
     "price": 200, 
 
     "distance": 1 
 
    } 
 
    }] 
 
} 
 

 
obj.response.sort(function(a, b) { 
 
    return a.candidate.price - b.candidate.price || a.candidate.distance - b.candidate.distance; 
 
}) 
 

 
console.log(obj.response)

+0

Ja, ich stimme zu - einfache 'sort' scheint gut genug zu sein. Ich bin mir nicht sicher, ob es in Underscore machbar ist. – vlaz

+0

Funktioniert perfekt, über Sie ist es möglich, drittes Argument hinzuzufügen? –

+0

Nicht sicher, was Sie damit meinen? –