[Ajax/jQuery] Hoe resultset muteren en sorteren?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Momenteel bezig met het ophalen en verwerken van cross-site data via Ajax calls. Helaas lukt het mij niet om deze resultaatset op een juiste wijze te muteren en te sorteren.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var apiurl = "https://api.websiteblabla.com/api/sqlite";
var srcname = "the_actual_source";
var sqlselect = "select name, currentvalue, previousvalue from stocks";

$.ajax({
    url:apiurl, 
    data:{
        name:srcname, 
        query:sqlselect, 
        format:"jsonlist"
    }, 
    dataType:"jsonp", 
    success:ProcessResults, 
    error: ProcessError 
});

ProcessResults(tdata) {
     $.each(tdata.data, function (i,v)
         {
             console.log(i,v);
         });
}


Resultaat komt als volgt binnen:
JavaScript:
1
2
({keys:["name", "currentvalue", "previousvalue"], 
data:[["Name1", 243, 287],["Name2", 212, 245],["Name3", 265, 278],["Name3", 222, 244]]})


Doelstelling is om het verschil in ranking te verkrijgen tussen de previous en current values. Is het mogelijk om:
  • Bovenstaande lijst te verwerken en nieuwe keys toe te voegen die volgende info geven:
    • CurrentRank
    • PreviousRank
    • Difference
Wanneer ik zelf met die console.log write doe. Krijg ik namelijk alleen de informatie van de data terug? Hoe kan ik ervoor zorgen dat het een array wordt met objecten, zoals:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
stocks = [
    stock [
        Name = "Name1",
        Previousvalue = 222,
        Currentvalue = 198,
        CurrentRank = 5,
        PreviousRank = 3,
        Difference = -2
    ],
    stock [
        Name = "Name2",
        Previousvalue = 222,
        Currentvalue = 198,
        CurrentRank = 5,
        PreviousRank = 3,
        Difference = -2
    ]
]

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Waarom stuur je de sorterings parameters niet mee naar de server en laat die het doen? Een database is doorgaans veel beter in het sorteren dan een browser.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Grijze Vos schreef op woensdag 07 november 2012 @ 16:30:
Waarom stuur je de sorterings parameters niet mee naar de server en laat die het doen? Een database is doorgaans veel beter in het sorteren dan een browser.
Die zit er al in, echter kan ik dan alleen sorteren op de waarde, maar krijg ik geen ranking terug. Dit wordt bij de achterliggende SQLite database niet ondersteund. Ik zou dus écht een clientside aanpassingen moeten doen. Ook omdat ik zowel een rankingvergelijkings wil toevoegen van de current en previous informatie.

Acties:
  • 0 Henk 'm!

  • Acid_Burn
  • Registratie: Augustus 2001
  • Laatst online: 16-07 13:45

Acid_Burn

uhuh

Hoe worden die rankings bepaald... kan je die berekening niet in je query opnemen?

Glass Eye Photography | Zelfbouw wireless fightstick | Mijn puzzel site


Acties:
  • 0 Henk 'm!

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Acid_Burn schreef op donderdag 08 november 2012 @ 14:27:
Hoe worden die rankings bepaald... kan je die berekening niet in je query opnemen?
Ranking wordt bepaald op de sortering van de currentvalue en previousvalue. Helaas kan je bij Sqlite in de query niet de ranking opvragen van sortering na de query.

Vraag: is het daadwerkelijk mogelijk om de resultset te muteren of aan nieuwe array met objecten toe te voegen zodat deze informatie clientside gegenereerd kan worden? Bovestaande antwoorden lijkt het dat het niet mogelijk is omdat beide met een suggestie verwijzing komen voor de SQL selectie/statement.

Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 17-07 11:21

TheNephilim

Wtfuzzle

Je kunt natuurlijk een soort proxy maken...

Dan roep je met ajax een php bestand op eigen server aan met parameters, die haalt de gegevens van de database op, gaat ze sorteren en dergelijke en stuurt ze dan door aan je ajax request.

Acties:
  • 0 Henk 'm!

  • Acid_Burn
  • Registratie: Augustus 2001
  • Laatst online: 16-07 13:45

Acid_Burn

uhuh

Kan je dan niet gewoon orderen op currentvalue (desc)... rank is dan gewoon de recordindex.

Daarnaast vind ik dit wel een hele linke constructie. Je zet de query gewoon bij de gebruiker neer. Wat als ik die met firebug gewoon verander in "delete from stocks"? Dan heb je een probleem.

Dit moet je, zoals TheNephilim als zegt, gewoon door php laten afhandelen. In die PHP kan je dan de rank bepalen en teruggeven.

Glass Eye Photography | Zelfbouw wireless fightstick | Mijn puzzel site


Acties:
  • 0 Henk 'm!

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
TheNephilim schreef op donderdag 08 november 2012 @ 16:54: Je kunt natuurlijk een soort proxy maken...
Is zo'n proxy niet mogelijk te maken met behulp van een verwerkende functie van de Ajaxcall? Moet dat perse een eigen server met parameters zijn?
Acid_Burn schreef op donderdag 08 november 2012 @ 17:04: Kan je dan niet gewoon orderen op currentvalue (desc)... rank is dan gewoon de recordindex.
Had al geprobeerd de 'rowid' of 'oid' op te vragen van de resultset, maar dan krijg ik een verwijzing naar de bron rowid's van de primaire tabel en niet van de rijen en de select.
Dit moet je, zoals TheNephilim als zegt, gewoon door php laten afhandelen. In die PHP kan je dan de rank bepalen en teruggeven.
Dat lijkt mij ook wel een idee, maar heb nog geen idee hoe je dit kan oplossen. Kan ik dit doen met een Array sort of kom ik dan alsnog in een volgend stappenplan uit voor de verwerking:
  1. Resultset met .each() omzetten naar array;
  2. Array sorteren op previous value;
  3. Array doorlopen met .each() en nieuwe previousrank waarde toevoegen met de positie in de array;
  4. Array sorteren op current value;
  5. Array doorlopen met .each() en nieuwe currentrank waarde toevoegen met positie in de array;
  6. Array doorlopen met .each() om verschil tussen previous en current te bepalen en die toe te voegen aan nieuwe array kolom;
Maar wordt idt qua clientperfomance niet een enorm gedrocht.

Acties:
  • 0 Henk 'm!

  • Woudloper
  • Registratie: November 2001
  • Niet online

Woudloper

« - _ - »

Topicstarter
Inmiddels opgelost met de volgende code:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
ProcessResults(tdata) {
    var data = tdata.data;
    
    // Sort on previous rank.
    var sorted = data.sort(function(a, b) {
        return b[2] - a[2];
    });
    // Add extra column for previous ranking.
    var extraColumn = sorted.map(function(arrayRow, index) {
        arrayRow[arrayRow.length] = index + 1;
        return arrayRow;
    });
    // Sort on current rank.
    var secondsort = extraColumn.sort(function(a, b) {
        return b[1] - a[1];
    });
    // Add extra column for current ranking.
    var secondColumn = secondsort.map(function(arrayRow, index) {
        arrayRow[arrayRow.length] = index + 1;
        return arrayRow;
    });
    // Add count/diff column.
    var diffColumn = secondsort.map(function(arrayRow, index) {
        arrayRow[arrayRow.length] = arrayRow[3]-arrayRow[4];
        return arrayRow;
    });
    console.log(secondColumn);
}


Helaas geen andere slimmere oplossing kunnen vinden. Gelukkig beschikt javascript over .map.
Pagina: 1