Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [jQuery] Wartości zmiennej po wykonaniu pętli
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
Polik
Witam!

Natrafiłem na bardzo irytujący problem, z którym męczę się już zbyt długo. Oto on (w skrócie):

mam dwie zmienne: tablica[] i mojaZmienna
przez pewien czas wykonuje pętle while i zmieniam w niej wartość zmiennej mojaZmienna ale przed każdą zmianą chcę sobie zapamiętać jej wartość więc podstawiam pod kolejne indeksy zmiennej tablica[] właśnie zmienną mojaZmienna. Poniżej taki pseudokodzik:

  1. //zmienne
  2. tablica[]
  3. mojaZmienna
  4.  
  5. //pętla
  6. while(warunek) {
  7. //chce zapamietac wartosc mojaZmienna w tej chwili
  8. tablica[kolejnyNumer] = mojaZmienna;
  9. //zmieniam wartosc moja zmienna
  10. mojaZmienna++;
  11. }


Problem w tym, że po zakończeniu pętli w każdej komórce tabeli[] zapisana jest ostatnia wartość zmiennej mojaZmienna zamiast kolejnych iteracji! Tak jakby w komórkach tabeli zapisywała się nie wartość lecz referencja do zmiennej mojaZmienna. Niestety nie znalazłem w necie odpowiedzi na to pytanie. Powiedzcie proszę co z tym zrobić żeby zaczęło działać poprawnie.

Pozdrawiam i będę wdzięczny za pomoc!
kamil4u
Podejrzewam, że kod jednak wygląda trochę inaczej niż tu zaprezentowałeś smile.gif
Pokaż nam dokładniejszy kod - albo chociaż przykład, gdzie takie coś występuje.

Strzelam, że chodzi o przypisanie odpowiedniego zdarzenia np. http://forum.4programmers.net/Webmastering...onclick_w_petli - gdzie ostatnie rozwiązanie jest tym polecanym przeze mnie. Jak nie strzeliłem to pokaż kod, gdzie możemy popatrzeć jak to działa smile.gif

Pozdrawiam

PS. Postaraj się na przyszłość nie dawać tagu jQuery, gdy pytasz o czysty JS, gdyż np. ja często omijam takie tematy - taka rada biggrin.gif
Polik
Ok, zamieszczam oryginalne źródło (poprzycinane w niektórych miejscach)

  1. var odleglosci = new Array();
  2. odleglosci = tabd;
  3. var tempik = { 'make' : 3, 'odleglosci' : odleglosci, 'opis' : 'Aktualna tablica odległości'};
  4. movie.push( tempik );
  5. var tempik = { 'make' : 4, 'odleglosci' : odleglosci, 'opis' : ''};
  6. movie.push( tempik );
  7.  
  8. ...
  9.  
  10. while(kolejka.length > 0) {
  11.  
  12. ...
  13.  
  14. var tempik = { 'make' : 7, 'first' : first, 'sasiady' : sasiady, 'opis' : 'Wybieramy z kolejki pierwszy element i badamy jego siąsiadów'};
  15. movie.push( tempik );
  16. var tempik = { 'make' : 8, 'first' : first, 'sasiady' : sasiady, 'opis' : ''};
  17. movie.push( tempik );
  18.  
  19. //przechodzimy po sasiadach wlasnie zdjetego elementu pierwszego z kolejki
  20. for(var j = 0; j < matrix[first].length; j++) {
  21.  
  22. //analizujemy tylko te elementy, które sa sasiadami elementu z kolejki czyli waga > 0
  23. if(matrix[first][j] > 0) {
  24.  
  25. //jezeli aktualnie najkrótsza droga w tablicy D jest wieksza od tej wlasnie badanej
  26. if(tabd[j] > (parseInt(tabd[first]) + parseInt(matrix[first][j])) || tabd[j] == 'oo') {
  27. tabd[j] = parseInt(tabd[first]) + parseInt(matrix[first][j]);
  28. poprzednik[j] = first;
  29.  
  30. var tempik = { 'make' : 9, 'vertex1' : first, 'vertex2' : j, 'opis' : 'Znalezniono, którszą drogę do wierzchołka ' + j + ' poprzez wierzchołek ' + first};
  31. movie.push( tempik );
  32. var tempik = { 'make' : 10, 'vertex1' : first, 'vertex2' : j, 'opis' : ''};
  33. movie.push( tempik );
  34.  
  35.  
  36. var odleglosci = new Array();
  37. odleglosci = tabd;
  38. var tempik = { 'make' : 3, 'odleglosci' : odleglosci, 'opis' : 'Tablica odległości zostaje zaktualizowana'};
  39. movie.push( tempik );
  40. var tempik = { 'make' : 4, 'odleglosci' : odleglosci, 'opis' : ''};
  41. movie.push( tempik );
  42. }
  43. else {
  44. var tempik = { 'make' : 11, 'vertex1' : first, 'vertex2' : j, 'opis' : 'Droga do wierzchołka ' + j + ' poprzez wierzchołek ' + first + ' jest dłuższa lub taka sama jak ta już znana'};
  45. movie.push( tempik );
  46. var tempik = { 'make' : 12, 'vertex1' : first, 'vertex2' : j, 'opis' : ''};
  47. movie.push( tempik );
  48. }
  49.  
  50. }
  51. }


i generalnie rozchodzi się o rzeczy w linijkach 1-6 i 36-41.

tablica tabd jest zdeklarowana na początku skryptu, globalnie dostępna dla każdej funkcji.
tempik jest zmienną tymczasową w której przechowuje array gdzie jedną z jego wartości jest tabd po kolejnych wykonaniach pętli.
po zakończeniu skryptu w zmiennej movie powinienem mieć "historię" m.in. zmiennej tabd - bo na niej mi najbardziej zależy.

Mam nadzieję, że jasno opisałem.
kamil4u
Nadal nie do końca rozumiem kod smile.gif
Ale przyszedł mi do głowy nowy pomysł - kopiując tablice, które w JS są obiektem robisz to chyba w sposób jak w linii 37:
Kod
odleglosci = tabd;
- jeśli taki był twój zamysł(, żeby skopiować) to źle to robisz, gdyż: http://kurs.browsehappy.pl/JavaScript/Obiekty -> Kopiowanie obiektów

Pozdrawiam i mam nadzieję, że to to smile.gif - a jak nie to proszę daj jak najprostszy kod, gdzie można to zaobserwować - może być inny od tego, ważne, żeby było widać problem.
Polik
Wielkie dzięki kamil4u link okazał się pomocny! Generalnie rozchodziło się o kopiowanie arraya.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.