Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [js] foreach - jak zastąpić
Forum PHP.pl > Forum > Po stronie przeglądarki
yarek12
Każdemu znana pętla z php foreach wyświetla wszystkie elementy z tablicy (bez powtórzenia tych samych), której oczywiście nie ma w js.

Teraz mój problem:
Mam skrypt który tworzy mi tablice i sumuje takie same wyniki w pętli while, np.:

  1. mat = new Array();
  2. mat[1] += 0.5;
  3. mat[2] += 1.5;
  4. mat[1] += 2;


Jak każdy zauważył w tablicy powtarzają się (mat[1]), teraz potrzebuję skryptu który zwróci mi:

mat[1] = 2.5
mat[2] = 2;

Prościej mówiąc wyświetli wszystkie wyniki z bazy bez powtórzeń.
Jakieś pomysł?
nospor
Kod
for (var i in mat){
alert(i);
alert(mat[i]);
}


ps:
Cytat
foreach wyświetla wszystkie elementy z tablicy (bez powtórzenia tych samych)
Coś motasz. foreach nie ma nic do "bez powtórzeń". Foreach otrzymuje tablicę i po niej iteruje. Nie bawi się w żadne bezpowtarzanie - to co dostanie to przetworzy
yarek12
Dobra, for, wyświetla mi tablicę, jednak nie mogę użyć =+ w tablicach - jak widać w pierwszym poście, ponieważ wtedy zwraca NaN, jak więc zsumować tablice o takich samych nazwach.
nospor
Bo najpierw się przypisuje a potem dodaje. js jest bardziej restrykcyjne niż php.
Kod
mat = new Array();
mat[1] = 0.5;
mat[2] = 1.5;
mat[1] += 2;
yarek12
hmm, o ty właśnie wiem. Tylko, że tablica mat powstaje w pętli i wykonuje się tyle razy ile jest inputów, jako pierwszą wartość w nawiasach bierze wartość selecta_1 a ostatnią wartość inputa_1.

O to chodzi, że cała tablica powstaje dynamicznie, więc jak sprawdzić czy dana wartość (ta w nawiasach) już wystąpiła, i jeśli wystąpiła to prze = dodać +questionmark.gif
nospor
Kod
Petla po i
if (typeof mat[i] == 'undefined')
    mat[i]=0;
mat[i] += wartosc;
koniec petli
yarek12
"Pętla po i" - nie za bardzo rozumiem.

Czekaj, czyli ta instrukcja warunkowa ma być w pętli for wyświetlającą tablice, czy mojej while tworzącą tablicę.'
Jestem początkujący, dlatego proszę o wyrozumiałość i dokładniejsze tłumaczenie.
Pawel_W
tworzącej
nospor
Oczywiście, że tworzącej, co już wsponiał Paweł
yarek12
Teraz chyba widzę problem, instrukcja warunkowa którą napisałeś chyba nie działa wedle moich oczekiwań, zobacz:

ja chcę zsumować talice gdzie i jest takie same, nie warość.

mat[1] = 0.5;
mat[2] = 0.5;
mat[1] = 0.5;


mat[i] = wartość.

Gdzie i jest takie same a nie wartość.
nospor
Wszystko co podałem jest ok, tylko ty nie umiesz lub nie rozumiesz lub źle wstawiasz lub wszystko naraz

Pokaz lepiej kod, który to wszystko generuje bo do usranej śmierci możemy tak się bawić.
yarek12
Dobra, za 20 min wrzucę kod jak będe w domu.
jeszcze raz dzięki za cierpliwość do mnie
nospor
Cytat
jeszcze raz dzięki za cierpliwość do mnie
Niedługo wyczerpiesz limit abonamentowy a potem za każde słowo będziesz płacił 50zł więc uważaj wink.gif
yarek12
A więc tak html, kod jest dynamiczny, ale pokaże jeden z przekładów:

  1. <input type="hidden" value="3" name="all">
  2. <inpu type="text" name="t_1" value="0.5"><input type="text" name="r_1" value="dom">
  3. <inpu type="text" name="t_2" value="2"><input type="text" name="r_2" value="lato">
  4. <inpu type="text" name="t_3" value="1"><input type="text" name="r_3" value="dom">


Oto kod html, z którego chciałbym otrzymać dom: 1.5 (0.5 + 1) oraz lato: 2.

Teraz moje wcale nie działające js:

  1. var lp = parseInt(document.getElementById("all").value);
  2. var i = 1;
  3.  
  4. while (lp >= i) {
  5. if (typeof mat[i] == 'undefined') {
  6. mat[i]=0;
  7. }
  8. else {
  9. mat[i] += parseInt(document.getElementById("t_"+i).value);
  10. }
  11.  
  12. }
nospor
Dobra, inaczej...
Pokaż kod, zanim zacząłeś robić zmiany. Przecież pętla co pokazałeś nie ma prawa działać, bo ani nie zmieniasz lp ani nie zmieniasz i. Pokaz kod jaki miałeś, bo coś czuję ze po zmianach zacząłęś kombinować jak koń pod górkę.
yarek12
Masz rację w pętli którą tu wkleiłem brakuje:

i++;

Jednak to pierwsze co próbowałem, html, jest taki sam jak był od początku, używam go do kodu php którym wysyłam do mysql, teraz jednak potrzebuję jeszcze dynamicznie informować użytkownika dlatego muszę użyć js. nie mam nic wcześniej.

Jest tylko pętla która wykonuje się tyle razy ile jest t_n i r_n (przykład wyżej).
Teraz potrzebuję zsumować t_n gdzie r_n są takie same.
nospor
Coś motasz kolego.
Jeśli i zwiększa w pętli, to nigdy w tej pętli nie będziesz miał sytuacji:
mat[1]
mat[2]
mat[1]
Nigdy.
Bedziesz miał sytuację:
mat[1]
mat[2]
mat[3]

Mówisz więc albo o różnych rzeczach albo już sam nie wiesz o czym mówisz. Nie chcę cię obrazic, nie mam takiego zamiaru. Zwracam ci delikatnie uwagę, że to co mówisz a to co pokazujesz nie trzyma się kupy.
yarek12
Może źle zrozumiałeś, mat[*] *-w nawiasie jest wartość r_n czyli drugiego inputa.

Na przykłąd do r_2 wpiszesz kot, a do t_2 wpiszesz 3, to będzie: mat[kot] = 3.

A jeśli pojawi się kilka t_n gdzie r_n jest takie same to je zsumuje.
nospor
Podałeś kod. Odniosłem się do tego kodu. Ten kod nigdy nie będzie miał tego co ci napisałem

mat[kot] = 3.
Jaki mat od kot? W pętli masz i które jest liczbą.
Mówisz o jednym, kod pokazujesz zupełnie inny.

Proszę poraz ostatni: pokaż kod jaki masz, a nie jakiś wirtualny który tworzysz na poczekaniu.
Jeśli zaś to jest kod, który masz to przestan wymyślać jakieś historyjki o 'kot', bo to ma się nijak do kodu, który pokazujesz.
yarek12
Kod właśnie jest dobry, zmyliła cię pętla która właśnie jak napisałeś pisałem na poczekaniu, i jest liczbowe i rośnie o 1 z każdym wykonaniem żeby pętla mogła się skończyć, i nie ma nic do mat.
Może prościej będzie jak pokaże ci mój kod php, który właśnie chcę zrobić w js:

Tworzenie tablicy:

  1. $ip = 1;
  2. $lp = $_POST['all_projects']; // liczba projektów
  3. while ($lp >= $ip) {
  4. $x = $_POST['x_'.$ip.''] / 1000;
  5. $y = $_POST['y_'.$ip.''] / 1000;
  6. $materialy[$_POST['mat_'.$ip.'']] += $x * $y;
  7. $ip++;
  8. }


Sumowanie takich samych:

  1. foreach ($materialy as $name => $mkw) {
  2. if ($mkw < 1) {
  3. $pow = 1;
  4. $mat_cena += $material['cena'][$name];
  5. }
  6. else {
  7. $pow = $mkw;
  8. $mat_cena += $pow * $material['cena'][$name];
  9. }
  10. }


Takie foreach sumował mi tablice $materialy gdzie pierwsza wartość w nawiasach była taka sama.
nospor
Sorki, mój mózg tego nie ogarnia. Z każdym kolejnym Twoim postem rozumiem coraz mniej.

Podsumowując: myk z 'undefined' jaki ci podałem jest ok, działa. A jak ty to wstawisz w swój kod, którego ja nie rozumiem, to juz Twoja sprawa lub kogoś innego kto będzie po mnie próbował to zrozumieć smile.gif
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.