Stefan12 napisał(a)
błędy składni wystąpiły po części z tego, że nie wkleiłem funkcji z edytora a pisałem z palca jako kod poglądowy, a część błędów wyszła ponieważ nie znam javascript
Zwykle lepiej jednak wkleić kod, na pewno lepsze wklejanie (i ew. usuwanie nieistotnych fragmentów) niż przepisywanie. Również dlatego, że -- jak sam mówisz -- masz problemy z JavaScriptem. Skąd my mamy wiedzieć, który z bugów to zwykła literówka, a który popełniłeś świadomie, z powodu niedostatecznej znajomości języka? Tak czy siak, warto przynajmniej zaznaczyć, że podajesz przykładowy, pisany z palca kod i np. prosisz o skupienie się na algorytmie, a nie na literówkach. Ale w Twoim przypadku sam język też może być przecież problemem.
Stefan12 napisał(a)
Tak przy okazji ciekawe czy Ty nigdy nie pytałeś o banały na forum ponieważ nie był czasu na naukę?
Nie, nigdy. Nie przypominam sobie bym zabierał się za dość skomplikowany problem programistyczny nie mając wielkiego pojęcia o języku i pytał się o kolejne konstrukcje językowe na forum. To takie dziwne?
Ja w ogóle bardzo staram się nie używać profesjonalnie technologii i technik, których nie znam i na których poznanie nie mam czasu. Wydaje mi się to nieprofesjonalne. Uczyć się czegoś przy projekcie można (o ile zleceniodawca wie, że się przy okazji uczymy), ale do nauki też trzeba podejść poważnie i trochę poczytać.
Nie wiem, czy dobrze ogarniam to, co chcesz zrobić. Nie pomagają mi ogólne nazwy identyfikatorów, które masz w kodzie -- takie jak obj czy params. Żeby to było w pełni zrozumiałe to musiałbyś to solidnie opisać i/lub solidnie napisać algorytm. A tak, jak np. przypisujesz coś do ogólnie brzmiącej zmiennej params
, a potem nigdzie jej nie używasz, to naprawdę nie mam jak się skapnąć, do czego to ustrojstwo służy ;).
Zakładam, że w funkcji chcesz odczytać obiekt zapisany w ciasteczku, zmodyfikować kilka własności tego obiektu (ewentualnie dodając niektóre lub wszystkie z tych własności), a następnie zapisać zaktualizowany obiekt do ciasteczka. Zakładam też, że funkcję SaveCookie można wywołać kilka razy z tym samym ID -- bo możemy chcieć zaktualizować wartości zapisane dla danego ID. To wprowadza do kodu trochę komplikacji, bo ciasteczko może, ale nie musi zawierać już jakieś dane związane z danym ID:
function SaveCookie(id, param1, param2, param3)
{
var cookie = ReadCookie();
// jeśli ciasteczko nie istniało, ustawiamy cookieData na nowy, pusty obiekt
var cookieData = eval('(' + cookie + ')') || {};
// jeśli do cookieData nie zostały wcześniej zapisane żadne ID do pola IDs,
// to ustawiamy pole IDs na pustą tablicę
cookieData.IDs = cookieData.IDs || [];
// jeśli do cookieData nie zostały zapisane informacje pod danym id,
// tworzymy pusty obiekt (puste pole) dla tych informacji
cookieData[id] = cookieData[id] || {};
// podstawiamy dla wygody, żeby nie musieć pisać cookieData.IDs
// (to zwiększa wydajność, zmniejsza rozmiar kodu po kompresji,
// ułatwia utrzymywanie bo nazwę własności IDs mamy w mniejszej ilości miejsc)
var cookieDataIDs = cookieData.IDs;
var cookieDataContainsCurrentID = false;
for (var i = 0; i < cookieDataIDs.length; i++) {
if (cookieDataIDs[i] === id) {
cookieDataContainsCurrentID = true;
break;
}
}
// zapisujemy id do listy, jeśli nie ma tego id na liście zapisanych
if (!cookieDataContainsCurrentID) {
cookieDataIDs.push(id);
}
// ponownie: podstawiamy sobie dla wygody
var cookieDataForCurrentID = cookieData[id];
cookieDataForCurrentID.param1 = param1;
cookieDataForCurrentID.param2 = param2;
cookieDataForCurrentID.param3 = param3;
// i tu ma nastąpić zapisanie obiektu cookieData do ciasteczka
// użyjesz cookieData.toSource() zgodnie z tym o czym dyskutowałeś z Demonical Monkiem
}
(kod poglądowy -- pisany z palca, nie testowany)
Jeśli masz gwarancję, że SaveCookie będzie wywoływane za każdym razem z nowym ID, to możesz ominąć parę rzeczy. Np. sprawdzanie, czy dane ciasteczka zawierają już bieżące ID.
Trochę głupio to wygląda, że tłumaczę w komentarzach konstrukcje typu zmienna = zmienna || domyślna wartość. W komentarzach używam słowa "jeśli", a w instrukcji przypisania nie ma żadnego if-a. Wydaje się to więc nieczytelne, skoro muszę to tłumaczyć. Jednak w JavaScripcie użycie operatora || zamiast if-a jest jednym z prostych idiomów, które po prostu trzeba opanować (nie wprowadzałem już innych idiomów, takich jak wydajniejszy zapis pętli for, coby Ci nie mącić).
Osobiście jestem praktycznie pewien, że nie potrzebujesz zapisywać do ciasteczka tablicy IDs. W JavaScripcie istnieje pętla for-in, która pozwala przetworzyć wszystkie własności danego obiektu. Nie musisz mieć tych własności spisanych w tablicy IDs.
Zauważ proszę, że jeśli tej funkcji przekażesz jako pierwszy parametr ciąg 'IDs', to zniszczy to zapisywaną tablicę ID. Nie rozwiązałem tego problemu w tym kodzie coby Ci nie gmatwać, ale jak chcesz, to mogę Ci wytłumaczyć obejście (po wyeliminowaniu tablicy IDs to w ogóle nie będzie już problemem).
O coś takiego Ci chodziło, czy źle zrozumiałem?