Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JS] przekazywanie tablicy jako parametr funkcji
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
iwosz
Witam,

łącze się z takim problemem iż mam funkcję do której przekazuję tablicę jako parametr, a dokładnie tablicę parametrów np:

Kod
var params = new Array();
params['p1'] = 1;
params['p2'] = 2;
params['text'] = 'text';
params['last_param'] = 0;

function postParams( params ) {
    var params_string = "";
    for(name in params) {
        params_string += "&"+name+"="+params[name];
    }
    // i dalej przesylamy ajaxem parametry...
}


problem polega na tym, że w tej tablicy czasem w ostatnim elemencie przesyłają się nieporządane dane, typu params['nazwa_jakiejś_funkcji'] = cialo_jakiejś_funkcji blinksmiley.gif przykład:

Kod
ajax_post.php?p1=1&p2=2&text=text&remove=function (b) {  var a = this.indexOf(b);  if (a != -1) {  this.splice(a, 1);  }  return this; }&sortDates=function () {  return this.sort(function (a, b) {return a.getTime() - b.getTime();}); }&last_param=0

i z niewinnie wyglądającej tablicy tworzy mi się jakiś potwór!? blinksmiley.gif

Czy to może być związane z przeglądaniem tablicy for'em ? Jak to jest możliwe że w wyjściowym stringu oprócz zdefiniowanych parametrów mam jeszcze jakiś szit?

Z góry dzięki za odp!

Pozdrawiam.
melkorm
Ponieważ zwraca Tobie też metody obiektu Array, możesz dać warunek że tylko gdy name jest stringiem, lub użyć normalnej konstrukcji for'a.
cojack
http://wstaw.org/m/2011/01/28/js.png coś knocisz.
iwosz
Cytat(melkorm @ 28.01.2011, 13:36:10 ) *
Ponieważ zwraca Tobie też metody obiektu Array, możesz dać warunek że tylko gdy name jest stringiem, lub użyć normalnej konstrukcji for'a.


Hmm, no tak ale czemu zmienna 'params' przechowuje tez te metody jako kolejne wartości tablicy? Rozumiem że to jest instancja typu Array i można dla niej wywołać dane metody, ale to nie powinno wpływać na wartości tablicy, czy nie mam racji?

Co do zwykłego for'a to jak mogę odczytać indeksy tablicy aby skleić poprawny string z parametrami bo nie widzę tego w dokumentacji JS? Poza tym skoro tablica zawiera także metody obiektu Array to nie ważne w jaki sposób będziemy tą zmienna przeglądać, zawsze natrafimy na te niechciane rekordy, tak?

czyli gdybyśmy użyli PHP'owej funkcji print_r() na zmiennej 'params' otrzymali byśmy:
Kod
params => Array(
    'p1' => 1,
    'p2' => 2,
    'text' => 'text',
    'remove' => function() { .. },
    'sortDates' => function() { .. }
)

tak? to jakiś absurd... blinksmiley.gif

Dzięki za odp! smile.gif

ps. cojack: hmm, też mi się wydaję że powinno być tak jak u Ciebie, to logiczne, zastanawiam się czy może zmienna 'params' nie jest nadpisywana gdzieś wcześniej w kodzie, szukam...
melkorm
Hum, pomyliłem się, ale to z pośpiechu bo też kiedyś miałem taki problem, ale teraz testuję i za nic nie mogę uzyskać tego samego, możliwe że tej zmiennej params są przypisane jakieś metody gdzieś?
Może używasz jakiegoś FW do JS'a?


Edit: no i już wiem, najwidoczniej Prototype dopisuje swoje metody do obiektu Array stąd takie błędy smile.gif Zmień Framework na jQuery i będzie git smile.gif
iwosz
Cytat(melkorm @ 28.01.2011, 14:02:04 ) *
no i już wiem, najwidoczniej Prototype dopisuje swoje metody do obiektu Array stąd takie błędy smile.gif


Hm, no tak, ale czemu wartości tablicy są nadpisywane? Zastanawia mnie jak to jest możliwe i czy powinno tak być...

Cytat(melkorm @ 28.01.2011, 14:02:04 ) *
Zmień Framework na jQuery i będzie git smile.gif


Akurat korzystam z jQuery winksmiley.jpg też testuje i wygląda na to że ta zmienna jest wcześniej nadpisywana... jak będę wiedział an 100% to dam znać!
everth
Cytat
tak? to jakiś absurd...

To jest normalne zachowanie - tablica w JS nie przechowuje pary klucz=>wartość, tylko same wartości (z liczbą porządkową jako kluczem), gdy ty próbujesz coś takiego
[JAVASCRIPT] pobierz, plaintext
  1. params = new Array();
  2. params.push('hihi');
  3. params.push('hehe');
  4. // Co jest równoznaczne z:
  5. params = ['hihi,'hehe'];
[JAVASCRIPT] pobierz, plaintext

to masz tablicę. Gdy robisz tak:
[JAVASCRIPT] pobierz, plaintext
  1. params['to'] = 'hihi';
  2. params['tamto'] = 'hehe'
  3. // Co jest równoznaczne z:
  4. params = {'to':'hihi','tamto':'hehe'};
[JAVASCRIPT] pobierz, plaintext

To już nie przyporządkowujesz wartości w tablicy, tylko właściwości obiektu typu Array. A to już zupełnie inna rzecz. Pętla for () in () działa tutaj dlatego że przechodzi przez wszystkie metody i właściwości w obiekcie (bez znaczenia na klasę). Sprawdź sobie wartość length tej tablicy - powinieneś zrozumieć.

A dalej nie rozumiem dlaczego dostajesz dodatkowe metody - pewnie dopisujesz je gdzieś wcześniej, albo to pochodna jakiegoś FW.
melkorm
Nie są nadpisywane, zauważ że zwraca Tobie poprawnie, tylko leci dalej po funkcjach dlatego masz remove=function().... itp.

To może gdzieś indziej "coś" dopisuje Tobie funkcje do obiektu Array? ale jak już mówiłem prosty warunek na wartość że nie jest obiektem powinien załatwić sprawę, chociaż problem będzie gdy parametr będzie obiektem, hehe.


Btw. Jeżeli używasz jQuery, to czemu nie zrobisz:

Kod
// dałem tu obiekt, ale z tablicą też powinien sobie poradzić;)
var params = {
a: 'b',
'b': 1
};

$.each(params, function(key,val)
{
alert(val);
}
);
iwosz
Cytat(everth @ 28.01.2011, 14:18:55 ) *
To jest normalne zachowanie - tablica w JS nie przechowuje pary klucz=>wartość, tylko same wartości (z liczbą porządkową jako kluczem), gdy ty próbujesz coś takiego
[JAVASCRIPT] pobierz, plaintext
  1. params = new Array();
  2. params.push('hihi');
  3. params.push('hehe');
  4. // Co jest równoznaczne z:
  5. params = ['hihi,'hehe'];
[JAVASCRIPT] pobierz, plaintext

to masz tablicę. Gdy robisz tak:
[JAVASCRIPT] pobierz, plaintext
  1. params['to'] = 'hihi';
  2. params['tamto'] = 'hehe'
  3. // Co jest równoznaczne z:
  4. params = {'to':'hihi','tamto':'hehe'};
[JAVASCRIPT] pobierz, plaintext

To już nie przyporządkowujesz wartości w tablicy, tylko właściwości obiektu typu Array. A to już zupełnie inna rzecz. Pętla for () in () działa tutaj dlatego że przechodzi przez wszystkie metody i właściwości w obiekcie (bez znaczenia na klasę). Sprawdź sobie wartość length tej tablicy - powinieneś zrozumieć.

A dalej nie rozumiem dlaczego dostajesz dodatkowe metody - pewnie dopisujesz je gdzieś wcześniej, albo to pochodna jakiegoś FW.


OK, dzięki za wyjaśnienie właśnie, teraz wszystko rozumiem. smile.gif Te metody muszą być gdzieś wcześniej dopisane do zmiennej z taką samą nazwą (tak mniemam).

melkorm: masz rację, to jest stary kod, ja go próbuję 'rewitalizować' i na pewno zrobię tak jak doradziłeś, poprostu zatrzymałem się na tej nieszczęsnej tablicy winksmiley.jpg

Tam Wam kliknąłem że pomogliście, dzięki! 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.