Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JSON] tabelka dostep do wartości
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
WiruSSS
Witam. Mam sobie tabelkę:

Kod
x\y        10     20     30     40     50     60     70     80     90


10        95     90     90     70     70     70     60     50     40
20        90     90     90     70     70     60     60     50     40
30        90     90     70     60     60     60     50     50     40
40        70     70     60     60     60     50     50     50     40
50        70     70     60     60     50     50     50     40     40
60        70     60     60     50     50     50     50     40     40
70        60     60     50     50     50     50     40     40     40
80        50     50     50     50     40     40     40     40     30
90        40     40     40     40     40     40     40     30     30


wartości x oraz y będą zawsze libczbą naturalną większą od zera.

Jak tę tabelkę opakowac do formatu JSON aby w miare latwo pobierać odpowiednią wartość, przy czym: wartści x/y z tabelki są wartościami granicznymi co oznacza nic innego że popodaniu przykładowo:
x=5, y=7 return 95
x=10, y=10 return 95
x=35, y=6 return 70
x= 70, y=85 return 40

czyli defaktu mamy w tej tabelce jakby zakresy. Najważniejsze zeby tę tabelkę zapakować jakoś do formatu JSON i w miarę prosty sposób zwracac odpowiednie wartosci.
lukasz1985
1. Napisz funkcję która przyjmuje parametry x i y i zwraca wynik z tabelki.
2. Utwórz pętlę for zagnieżdżoną w innej pętli for:
[JAVASCRIPT] pobierz, plaintext
  1.  
  2. var obiekt = {}
  3.  
  4. for(int i = 10; i<= 90 ; i++ ) {
  5. for (int j = 10; j <= 90; j++) {
  6. obiekt[i] = {}
  7. obiekt[i][j] = funkcja(i,j)
  8. }
  9.  
  10. }
[JAVASCRIPT] pobierz, plaintext



3. Znajdź bibliotekę, która przetwarza obiekty na JSON, np: https://github.com/douglascrockford/JSON-js...master/json2.js i dołącz ją do HTML.

4. JSON.stringify(obiekt) zwróci string - obiekt JSON

Myślę, że powinno działać.

Nie rozumiem co rozumieć pod pojęciem "odpowiednio zwracać"
WiruSSS
z samoą funkcją zapewne nie będę miec problemu. Wszystko o czym piszesz doskonale rozumiem. Moim problemem jest zapakowanie tej tabelki do obiektu JSON tongue.gif

..ogólnie chciałbym uniknąć czegoś takiego ..ale jesli nie ma innej rady tongue.gif

[JAVASCRIPT] pobierz, plaintext
  1. "values":
  2. [
  3.  
  4. [100,100,90],
  5. [200,100,90],
  6. [300,100,90],
  7. [400,100,70],
  8. [500,100,70],
  9. [600,100,70],
  10. [700,100,60],
  11. [800,100,50],
  12. [900,100,40],
  13. [1000,100,40],
  14.  
  15. [100,200,90],
  16. [200,200,90],
  17. [300,200,90],
  18. [400,200,70],
  19. [500,200,70],
  20. [600,200,60],
  21. [700,200,60],
  22. [800,200,50],
  23. [900,200,40],
  24. [1000,200,40],
  25.  
  26. .
  27. .
  28. .
  29. .
  30. .
  31. .
  32. . itd...
  33.  
  34. ]
[JAVASCRIPT] pobierz, plaintext



..bo jak narazie jedyny pomysł jaki mi przychodzi do głowy to własnie zbudowanie takiej tablicy i przjechanie po jej elementach:


[JAVASCRIPT] pobierz, plaintext
  1. ...wczesniejszy kod z petlą
  2.  
  3. result = values[i][2];
  4.  
  5. if(values[i][0]>x && values[i][1]>y) break;
  6.  
  7. ...dalszy kod
[JAVASCRIPT] pobierz, plaintext
lukasz1985
Nie ma czegoś takiego jak "obiekt JSON"

JSON to skrót od JavaScript Object Notation - notacja obiektu JavaScript. Jest to inaczej - forma zapisu, właściwym zapisem JSON jest na przykład:
[JAVASCRIPT] pobierz, plaintext
  1. var obiekt = {
  2. "poleA": 10,
  3. "poleB": "Jakiś tekst"
  4. "poleD": [1,2,3,4,5]
  5. }
[JAVASCRIPT] pobierz, plaintext


Inaczej tworzony jest obiekt w kodzie, który Ci podałem.
Przed zewnetrzną pętlą "for" jest definicja obiektu. W pętli for tworzone są pola tego obiektu. Rezultatem będzie ten sam obiekt, jakby miał być tworzony odręcznie. Możesz to zrobić też odręcznie ale to chyba nie ma sensu?

Celem JSON.stringify jest właśnie utworzenie takiego "odręcznego" zapisu w stringu. Chyba o to Ci chodzi?
WiruSSS
...cały czas starasz się mnie uczyć podstaw smile.gif ..ja to znam ..mnie bardziej chodzi o najbardzeij efektywne zapakowanie tej tabelki do JSON ..nie w sensie automatyzacji ..bo to ma być edytowalny plik konfiguracyjny ..a bardzeij od strony wydajnościowej w późniejszym przeszukiwaniu smile.gif

JSON to obiekt zserializowany jest stringiem natomiast sparsowany jest najzwyczajniejszym obiektem ..zresztą Twój kod mówi zam za siebie ..i nawet jak to ładnie nazwałes tongue.gif ..cały javascript to obiekt wink.gif
lukasz1985
Może uściślij swoje pytanie. Wtedy może nawet sam sobie na nie odpowiesz smile.gif
WiruSSS
...ale jak ma to bardziej uscislić?

chodzi mi o najlepszy (najefektywniejszy w przeszukiwaniu) z możliwych zapis tej tabelki w formie JSON

[EDIT]

tak sobie myślę ...chyba jednak nie ma szybszego sposobu ...jak ten co przedstawiłem kilka postów wcześniej. Co najwyżej można ewentualnie przed iteracją sprawdzić różnicę miedzy pierwszm a ostatnim elementem tablicy i ewentualnie ją odwrócić, żeby mniej przebiegów pęlti było ..ale to i tak chyba znikomy zysk wydajności przy tej liczbie elementów
lukasz1985
Zapis nie ma większego znaczenia, jeśli użyjesz dobrego algorytmu, na przykład używając drzew binarnych (binary tree) ilość potrzebnych operacji do znalezienia obiektu nie rośnie wprost proporcjonalnie do ilości elementów. Nie znam szcegółów implementacji, jest o tym dużo w sieci.

Jeśli nie interesuje Cię to rozwiązanie i za każdym razem chcesz iterować wszystkie pola obiektu w celu przeszukiwani - wtedy pozostałbym przy tym co jest - tego już raczej nie da się zoptymalizować.
WiruSSS
...przeglądnąłem trochę materiałów na temat tych kopców ..jednak w moim przypadku jest o tyle prościej, że sama struktura (tabela w postaci JSON) będzie wpisywana ręcznie do pliku (plik konfiguracyjny) ...i nie będzie przeszkody żeby wpisć to posortowane. mozna pokusic się o napisanie funkcji rekurencyjnej która bedize wybierać srodkowy element z całego zakresu i sprawdzac czy obie wartosci są wyższe lub niższe, wtedy ograniczy zakres odpowiednio w dół lub w góre i znów z nowego zakresu pobierze element środkowy, w ten sposób zamiast iterować np kilkaset razy może wystarczyć kilka kilkanaście takich kroków. chyba dla testów (i z czystej ciekawości) wyprobuję obie wersje smile.gif

druga sprawa to taka, że ja nie potrzebuję pobrac najmniejszego lub najwiekszego elementu tylko porównać z tą tabelką i wybrać najbliższy mniejszy
lukasz1985
Ja myślę, że warto się nauczyć tych drzew binarnych. Java, przykładowo posiada wbudowane biblioteki to tego celu, gdzie wyszukiwanie w kolekcjach wykonywane jest poprzez właśnie algorytm drzew binarnych. Inną sprawą jest, że to bardzo ważna technika, którą, każdy, kto zajmuje się programowaniem powinien poznać, ze względu choćby na implikacje jakie niesie to dla efektywności programów.

Lepiej mieć do czynienia z 10 iteracjami niż z 2000.
WiruSSS
Bardzo ciekawe zagadnienie i zapewne znajdę w przyszlości jakies zastosowanie. co do obcnego problemu, po głebszej analizie doszedłem do wniosku że zupełnie wystarczy zwykła pętla. Tablica nie bedize zawierała nigdy więcej jak 100-120 elementów. Petla bedize wykonywana zawsze raz przy wczytywaniu strony.

Wygenerowałem sobie tablicę 100 elementową. Tablicę wrzucilem do petli testującej, która wykonuje się równo przez 1000ms (sekundę). W każdym przebiegu pętli testującej losuje x,y i przeszukuję tablicę iterując ją. Pętla testująca wykonuje się w ciągu sekundy 45000-50000 razy (zaleznie jak czesto wylosuje niskie wartości x,y) ...chyba zbędna tu optymalizacja haha.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.