2017-01-06 1 views
3
Sortierung

So habe ich ein Array von Objekten ab:Javascript benutzerdefinierte ein Array von Objekten für Jahr mit "pre Jahr

var a = {user: [ 
{year:'1950',name:'Joe'}, 
{year:'19XX',name:'Chris'}, 
{year:'1980',name:'Bob'}, 
{year:'1955',name:'Jan'} 
]} 

ich diese Daten verwenden, einfache Elemente Vorlage aus dem Jahr und den Namen zu halten. Ich habe auch Option über ein select-Element, um diese Daten zu sortieren und dann die sortierten zu verwenden, um es wieder in der Reihenfolge sortieren. (Bob, Chris, Jan, Joe) oder Jahr. Aber mein Problem beginnt mit dem Jahr.

Ich brauche der ein einfaches Plugin jsonQ (http://ignitersworld.com/lab/jsonQ.html) verwenden, um weiterhin Daten zu bearbeiten und sortieren, und müssen Daten für Jahr ein wenig anders als ab oder asc tatsächlich haben.

1. Ich muss die Daten in verschiedenen Teilen bearbeiten, wie Jahr (19XX sollte ‚Pre 1950‘ geworden):

//inside ajax success function 
var dataObj = jsonQ(data); 

dataObj.find('year').value(function (data){ 
    if (data == '19XX') { 
     return 'pre 1953' 
    } else { 
     return data; 
    } 
}); 

Jetzt werde ich ein Endprodukt Datensatz haben, die sortiert werden muss.

var orderedData = dataObj.sort('year', {'order' : 'ASC'}); 

Aber das gibt mir die Daten zurück:

{ 
user: [ 
    {year:'1950',name:'Joe'}, 
    {year:'1955',name:'Jan'},  
    {year:'1980',name:'Bob'}, 
    {year:'Pre 1950',name:'Chris'} 
] 
} 

Was ich brauche, ist die Daten zurückgegeben werden, wie:

{ 
user: [ 
    {year:'Pre 1950',name:'Chris'}, 
    {year:'1950',name:'Joe'}, 
    {year:'1955',name:'Jan'},  
    {year:'1980',name:'Bob'} 
] 
} 

Irgendwelche Vorschläge?

+1

Sie müssen Ihre eigene Vergleichsfunktion definieren. Tatsächlich ist P lexikographisch größer als jede Ziffer. –

Antwort

0

Ich habe gefunden, nur die Lösung, kurz nach der Einlieferung, während das Plugin. (was ich wollte, Sorry, ich hätte das mehr angeben sollen).

Mein Problem wurde in meine Optionen sort() Methode des Plugins übergeben. nicht einfach, da Dokumentation zu finden, ist nicht 100.

var orderedData = dataObj.sort('year', { 
    'order' : 'ASC', 
    logic: function(val){ 
    return (val == 'pre 1950') ? '1911' : val; 
    } 
}); 

Was dies im Wesentlichen tut ist "pre 1950 mit 1911 nur zu Sortierzwecken zu ersetzen.

+0

können Sie Parantises um den Zustand überspringen. –

+1

@NinaScholz - du hast Recht .. alte Gewohnheiten sterben schwer :) – lscmaro

2

Nun können Sie Ihr eigenes Sortierkriterium implementieren und es an Array.sort() übergeben.

Dieses Kriterium hat die Form eines function(a, b), die eine Zahl zurückgibt:

  • Negative wenn a sollte vor b in der sortierten Liste gehen
  • Null wenn a und b im wesentlichen gleich
  • Postive wenn a sollte nachgehen

Diese ziemlich willkürlich aussehen, aber denken Sie an es auf diese Weise: im einfachen Fall von Zahlen von kleineren zu größeren Sortierung, die Funktion a - b zurückgibt. a - b und a - b < 0 bedeutet a < b.

Zurück zu Ihrem Fall. Lassen Sie uns ein Kriterium Funktion implementieren, die die Jahre von weniger zu mehr sortiert, Pre 1950 an der Spitze setzen:

function byYear(a, b) { 
    if (a === "Pre 1950") return -1 // a goes before 
    if (b === "Pre 1950") return 1 // b goes before 

    return parseInt(a) - parseInt(b) // lesser goes before 
}) 

Probieren Sie es im Browser-Konsole:

> ["1980", "1970", "Pre 1950"].sort(byYear) 
["Pre 1950", "1970", "1980"] 

Da Sie Objekte zu sortier, Sie muss die obige Kriteriumfunktion anpassen, um mit a.year und b.year zu arbeiten.

+0

Das 'if (a ===" Pre 1950 ") return -1;' part ist nicht notwendig. – Mihailo

+0

Nicht für Computer, aber wohl notwendig für Menschen =) – slezica

+1

Ich denke, Sie haben einen Punkt. +1 für die detaillierte Antwort. Gut gemacht. – Mihailo

0

Sie könnten das Array in drei Schritten

  • Sortpriorität Jahre sortieren, wie 19XX
  • sortiert nach Jahren ohne Priorität
  • nach Namen sortieren.

var a = { user: [{ year: '1950', name: 'Joe' }, { year: '19XX', name: 'Chris' }, { year: '1980', name: 'Bob' }, { year: '1955', name: 'Jan' }] }; 
 

 
a.user.sort(function (a, b) { 
 
    var order = { '19XX': -1 }; 
 
    return (order[a.year] || 0) - (order[b.year] || 0) || a.year - b.year || a.name.localeCompare(b.name); 
 
}); 
 

 
console.log(a);

Verwandte Themen