Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JS] Toevoegen array wil niet

Pagina: 1
Acties:

  • Shapeshifter
  • Registratie: Januari 2004
  • Laatst online: 21-11 16:34

Shapeshifter

Get it over with

Topicstarter
Ik heb een raar probleem waar ik even niet uitkom en zoeken levert ook niets op. Het komt erop neer dat wanneer ik array B toevoeg aan array A, opeens alle elementen in A hetzelfde zijn als B. Even een minimalistisch voorbeeld:

JavaScript:
1
2
3
4
5
6
7
B = [1, 1, 1, 1, 1, 1, 1, 1];
A = [{1: B}];
B[0] = 2;
A[0][2] = B;

alert(A[0][1]);
alert(A[0][2]);


Ik verwacht A[1] = [1, 1, 1, 1, 1, 1, 1, 1], A[2] = [2, 1, 1, 1, 1, 1, 1, 1], maar ze zijn dus allebei [2, 1, 1, 1, 1, 1, 1, 1]...

Waarom gaat dit fout en hoe los ik het op?

HP ZBook Studio G3 - Hyundai Ioniq EV Classic - Opel Vivaro-e 75kWh - 22x Prusa i3 MK3S - 8x Prusa MINI+ - Ooznest Workbee 1,5m x 1,5m


  • Turani
  • Registratie: Oktober 2011
  • Laatst online: 07-11 12:14
Even snel uit me hoofd

JavaScript:
1
2
3
4
5
6
7
8
9
10
B = [1, 1, 1, 1, 1, 1, 1, 1]; 

A = [{1: B}]; 

C = B.slice(0)
C[0] = 2;     
A[0][2] = C; 

alert(A[0][1]); 
alert(A[0][2]);


Waarom (volgens mij, het is laat) het mis gaat is in je gegeven code is dat je de referentie opslaat naar B... dus niet daadwerkelijk de array zelf...

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Dit is inderdaad het verschil tussen pass by reference (wat hier gebeurt) en pass by value (wat je graag zou willen). Ik weet zo even niet hoe het in JS werkt maar in de meeste talen kun je expliciet aangeven dat je de waarde van een variabele door wil geven in plaats van de variabele zelf, óf je kunt aangeven dat je een clone van de variabele wil maken die je vervolgens gewoon by reference door kan geven.

Afgezien van dat: JavaScript hoort in Webdesign, Markup & Clientside Scripting. ;)

PRG >> WEB

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Shapeshifter
  • Registratie: Januari 2004
  • Laatst online: 21-11 16:34

Shapeshifter

Get it over with

Topicstarter
Turani bedankt :) De .slice(0) was inderdaad de oplossing. Weer wat geleerd.

NMe, ohja, ik was even vergeten dat dat subforum ook bestond, sorry...

HP ZBook Studio G3 - Hyundai Ioniq EV Classic - Opel Vivaro-e 75kWh - 22x Prusa i3 MK3S - 8x Prusa MINI+ - Ooznest Workbee 1,5m x 1,5m


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:38

.oisyn

Moderator Devschuur®

Demotivational Speaker

Turani schreef op maandag 17 december 2012 @ 02:00:
Even snel uit me hoofd

JavaScript:
1
2
3
4
5
6
7
8
9
10
B = [1, 1, 1, 1, 1, 1, 1, 1]; 

A = [{1: B}]; 

C = B.slice(0)
C[0] = 2;     
A[0][2] = C; 

alert(A[0][1]); 
alert(A[0][2]);


Waarom (volgens mij, het is laat) het mis gaat is in je gegeven code is dat je de referentie opslaat naar B... dus niet daadwerkelijk de array zelf...
Je gebruikt hier wel een beetje een omweg. De wens is dat er een kopie van B in A wordt opgeslagen, dus ik zou dan ook daar de slice doen, zodat je daarna gewoon naar hartelust B kunt aanpassen.
JavaScript:
1
2
3
B = [1, 1, 1, 1, 1, 1, 1, 1]; 
A = [{1: B.slice(0)}];
// ...

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.