2016-04-01 11 views
4
var city = [{ 
"city":"London" 
},{ 
"city":"Wales" 
} 
,{ 
"city":"Atom" 
} 
,{ 
"city":"Bacelona" 
}]; 

city.sort(function(a,b){ 
return a.city - b.city; 
}) 

console.log(city) 

Nicht sicher, was ist falsch mit oben genannten Code, warum ist es nicht sortieren? meine Logik scheint in Ordnung zu sein.Sortieren nach Objekt Wert funktioniert nicht?

Antwort

2

Rückkehr in die Funktion für Strings:

return a.city.localeCompare(b.city); 

var city = [{ "city": "London" }, { "city": "Wales" }, { "city": "Atom" }, { "city": "Bacelona" }]; 
 

 
city.sort(function (a, b) { 
 
    return a.city.localeCompare(b.city); 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(city, 0, 4) + '</pre>');

+0

localCompare gegen '>', was besser ist? – Jennifer

+0

'localeCompare' ist langsamer, aber einfacher zu verwenden, da es -1, 0 und 1 wie eine Sortierfunktion ausgibt. Außerdem müssen Sie darauf achten, dass Sie keine Nicht-String-Eigenschaften aufrufen, sonst wird wahrscheinlich Folgendes ausgelöst: '(6) .localeCompare (" A ")'. – dandavis

+0

Ich würde für localeCompare gehen, wie meine Antwort vorschlagen. die Lösung mit kleiner als ist schwierig, weil es nur zwei Werte anstelle von dir (-1, 0, 1) zurückgibt. –

2

Sie nicht - Operator auf Strings verwenden können, sind sie nur für Zahlen. Sie müssen <, >, <= oder >= für lexigrafische Reihenfolge verwenden.

Nina Scholz 'Antwort ist sehr nützlich, wenn Sie mit nicht-englischen Wörtern arbeiten und mit englischen Wörtern arbeiten.

Durch einfaches Ändern der --> würde den Code Arbeit machen:

var city = [{ 
    "city": "London" 
}, { 
    "city": "Wales" 
}, { 
    "city": "Atom" 
}, { 
    "city": "Bacelona" 
}]; 

city.sort(function(a,b){ 
    return (a.city > b.city ? 1 : (a.city === b.city ? 0 : -1)); 
}); 

console.log(city); 
+0

Dies wäre auf alle duplizierten Werte instabil, in denen eine "0" zurückgegeben werden sollte. es ist auch technisch eine Eigenart, nicht eine von "[-1,0,1]" in einer sort() zurückzugeben, und es garantiert nicht überall zu arbeiten ... – dandavis

+0

@dandavis, wenn die Stadt dupliziert wird, dann die Reihenfolge die zwei (oder mehr) Objekte können nicht so bestimmt werden. Sie können danach weitere Bedingungen angeben, z. B. return (a.city> b.city) || (a.latitude> b.latitude) ' – Jamie

+0

nah, du brauchst nur etwas wie' return a.city> b.city? 1: (city == b.city? 0: -1); 'zu vermeiden, einen Betrogenen zu mischen. Objekte mit doppelten Eigenschaften und mehr als einer sichtbaren Stütze können einfach die vorhandene Indexposition als zweites Kriterium verwenden, um Stabilität zu erreichen: http://stackoverflow.com/a/2085225/2317490 – dandavis

Verwandte Themen