[js] Array-key volgorde probleem

Pagina: 1
Acties:

  • Koeniepoenie
  • Registratie: Oktober 2003
  • Laatst online: 14-11-2025
Heej mensen,

Ik heb voor een js-applicatie de mogelijkheid nodig om de volgorde van een array te wijzigen. De array is een 2-dimensionale associatieve array, bijv:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Array
(
    [test] => Array
    (
        [lorem] => Ipsum
        [dolor] => Sit
        [amet] => Consectetuer
    )
    [blaat] => Array
    (
        [elit] => Vivamus
        [donec] => Purus
    )
)

Nu tracht ik te bereiken dat je de key 'test' (met bijbehorende elementen uiteraard) zowel naar onderen als naar boven kan plaatsen. Uiteraard kan naar boven in het geval van 'test' niet, maar van 'blaat' wel. Ook de keys in een niveau dieper moeten deze mogelijkheden hebben.

Omdat het met ingebakken functies niet echt lukte (array_splice e.d. werken alleen met numerieke keys afaik), heb ik mijn eigen functie geschreven. De functie om een element naar beneden te schuiven werkt voor zowel IE als Fx, dus dat is het probleem niet. Echter, mijn functie om een element naar boven te schuiven werkt alleen in Fx.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Object.prototype.moveUp = function(zoekIndex) {
    var nieuw = {}, vorigeVal = vorigeInd = null;
    for (var i in this) {
        if (typeof this[i] == 'function') continue;
        if (i == zoekIndex) {
            nieuw[vorigeInd] = null;
            delete nieuw[vorigeInd];
            nieuw[i] = this[i];
            nieuw[vorigeInd] = vorigeVal;
        }
        else {
            nieuw[i] = this[i];
            vorigeVal = this[i];
            vorigeInd = i;
        }
    }

    return nieuw;
}

// En dan aanroepen met:
testArray = testArray.moveUp('blaat');


In Fx werkt 't dus naar behoren, alleen geeft IE geen kik. Na een tijdje debuggen kom ik niet verder dus vraag ik hierbij of iemand van jullie een idee heeft waar mijn fout ligt?

Parse error: syntax error, unexpected GOT_USER in https://gathering.tweakers.net on line 1337


  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 08-10-2025
Wil je je naar-beneden-schuif functie ook ff posten?

  • André
  • Registratie: Maart 2002
  • Laatst online: 23-02 17:02

André

Analytics dude

Je kunt met handig gebruik van de array.sort functie alleen de 2 gewenste elementen sorteren/omdraaien :)

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

De specificatie laat zich niet uit over de volgorde waarin array-elementen worden geitereerd bij een for-in constructie (note overigens dat for-in ook prototyped methods mee-itereerd). In het bijzonder Opera zal zich niet aan de LILO volgorde houden die andere browsers wel lijken te hanteren.
Als volgorde belangrijk is zal je dus toch met numerieke indices moeten werken.

Intentionally left blank


  • Koeniepoenie
  • Registratie: Oktober 2003
  • Laatst online: 14-11-2025
Rekcor schreef op dinsdag 04 april 2006 @ 09:10:
Wil je je naar-beneden-schuif functie ook ff posten?
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Object.prototype.moveDown = function(zoekIndex) {
    var nieuw = {}, foundIndex = false, foundVal = foundInd = null;
    for (var i in this) {
        if (typeof(this[i]) == 'function') continue;
        if (foundIndex) {
            nieuw[i] = this[i];
            nieuw[foundInd] = foundVal;
            foundIndex = false;
        }
        if (i == zoekIndex) {
            foundVal = this[i];
            foundInd = i;
            foundIndex = true;
        }
        else {
            nieuw[i] = this[i];
        }
    }
    return nieuw;
}
André schreef op dinsdag 04 april 2006 @ 09:27:
Je kunt met handig gebruik van de array.sort functie alleen de 2 gewenste elementen sorteren/omdraaien :)
Nou, de lengte is variabel (van het aantal keys), en ik sorteer niet, maar wil gewoon de volgorde veranderen ;)
crisp schreef op dinsdag 04 april 2006 @ 10:20:
De specificatie laat zich niet uit over de volgorde waarin array-elementen worden geitereerd bij een for-in constructie (note overigens dat for-in ook prototyped methods mee-itereerd). In het bijzonder Opera zal zich niet aan de LILO volgorde houden die andere browsers wel lijken te hanteren.
Als volgorde belangrijk is zal je dus toch met numerieke indices moeten werken.
Hm, dat is wel vervelend.. Maar ik heb net meteen ff de code getest in Opera (8.5) en daar lijkt het wel gewoon te werken.

Mjah, blijkbaar zal ik toch iets met numerieke indices moeten doen, ik zal eens kijken hoe ik dat kan oplossen. Aangezien ik lastig IE kan uitsluiten hier..

Parse error: syntax error, unexpected GOT_USER in https://gathering.tweakers.net on line 1337


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Latere versies Opera lijken ook LILO te doen. Het blijft echter een grijs gebied waar je je in gaat begeven.
In ieder geval werkt dit ook onder IE:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Array.prototype.moveUp = function(zoekIndex)
{
    var nieuw = [], lastI;
    for (var i in this)
    {
        if (Array.prototype[i]) continue;

        if (i == zoekIndex)
        {
            nieuw[i] = this[i];
        }
        else
        {
            if (lastI !== undefined) nieuw[lastI] = this[lastI];
            lastI = i;
        }
    }
    if (lastI !== undefined) nieuw[lastI] = this[lastI];

    return nieuw;
}

Intentionally left blank


Verwijderd

Koeniepoenie schreef op dinsdag 04 april 2006 @ 12:12:
[...]
Nou, de lengte is variabel (van het aantal keys), en ik sorteer niet, maar wil gewoon de volgorde veranderen ;)
[...]
Da's juist de gein, je kan een functie meegeven die bepaald of paren moeten worden omgedraaid of niet. Die functie moet je dus zo klussen dat je alleen het gewenste paar omdraait.

  • Koeniepoenie
  • Registratie: Oktober 2003
  • Laatst online: 14-11-2025
Ik heb ook nog even naar de mogelijkheid van mophor gekeken, maar dit ging niet echt werken. De functie van crisp werkt idd naar behoren, de aanpak is blijkbaar net wat anders dan die van mij. Ik ga de applicatie uiteraard nog uitgebreid testen, dus misschien kies ik ook wel voor een wat 'veiligere' methode, waarbij ik de array anders indeel en met andere functies weet te veranderen. Het huidige lijkt echter aardig te werken.

[ Voor 4% gewijzigd door Koeniepoenie op 04-04-2006 14:09 ]

Parse error: syntax error, unexpected GOT_USER in https://gathering.tweakers.net on line 1337

Pagina: 1