[js] Probleem met array push

Pagina: 1
Acties:

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Ik heb een heel vreemd probleem. Ik bouw een array in javascript op. Als ik bij het opbouwen elk element met een alert() toon kloppen alle gegevens. Als ik vervolgens de array bekijk dan klopt het aantal entries, echter elk element toont de gegevens van de laatste entry.

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
function view_current(XMLRequest)
{
        var xml_doc, entries;
        var playlist_item       =       new Array();
        var i;

        if (XMLRequest.readyState != 4)
        {
                return false;
        }

        // set up playlist for entries
        playlist        =       new Array();
        // request has been completed, process it
        xml_doc         =       XMLRequest.responseXML.getElementsByTagName('data').item(0);
        entries         =       xml_doc.getElementsByTagName('entry');
        entry           =       entries.item(0);

        state           =       get_field(entry, 'state');
        artist          =       get_field(entry, 'artist');
        title           =       get_field(entry, 'title');
        position        =       get_field(entry, 'position');
        length          =       get_field(entry, 'length');
        track_id        =       get_field(entry, 'track_id');

        // note that we are starting at element 1 here, the
        // first element is reserved for the currently playing file
        for (i = 1; i < entries.length; i++)
        {
                entry                           =       entries.item(i);

                playlist_item['time']           =       get_field(entry, 'time');
                playlist_item['artist']         =       get_field(entry, 'artist');
                playlist_item['title']          =       get_field(entry, 'title');
                playlist_item['album']          =       get_field(entry, 'album');
                playlist_item['track']          =       get_field(entry, 'track');
                playlist_item['year']           =       get_field(entry, 'year');
                playlist_item['genre']          =       get_field(entry, 'genre');
                playlist_item['position']       =       get_field(entry, 'position');
                playlist_item['id']             =       get_field(entry, 'id');

                // playlist.push(playlist_item);
                playlist[playlist.length]       =       playlist_item;

                // dit geeft voor elke entry de correcte gegevens
                alert(dump(playlist_item));
        }

        // dit geeft het juiste aantal resultaten
        // maar elk element toont de gegevens van
        // de laatste entry
        alert(dump(playlist));

        update_screen();
        update_playlist();
}
Zoals je ziet heb ik het geprobeerd door handmatig een index op te geven en met de push methode. Beide geven hetzelfde, vreemde resultaat.

dump is een klein functietje dat ongeveer hetzelfde doet als php's print_r.

Wat is nu precies de reden van dit vreemde resultaat en, belangrijker, hoe los ik het op?

Ik ontken het bestaan van IE.


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

JS doet voor objecten assignments by reference, niet by copy.
Persoonlijk zou ik het zo doen:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
playlist.push(
    {
        time        : get_field(entry, 'time'),
        artist      : get_field(entry, 'artist'),
        title       : get_field(entry, 'title'),
        album       : get_field(entry, 'album'),
        track       : get_field(entry, 'track'),
        year        : get_field(entry, 'year'),
        genre       : get_field(entry, 'genre'),
        position    : get_field(entry, 'position'),
        id      : get_field(entry, 'id')
    }
);

en de hele playlist_item array vergeten
(en ja, een object - array's zijn niet bedoelt voor associatief gebruik in JS)

Intentionally left blank