• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

JSON.parse() w JavaScript

Object Storage Arubacloud
0 głosów
278 wizyt
pytanie zadane 4 listopada 2018 w JavaScript przez Quetrino Nowicjusz (150 p.)

Witam. Napisałem prostą aplikację, która losuje liczbę, a użytkownik musi ją odgadnąć. Dodałem również funkcję, która wyświetla ostatnie wyniki. Chciałem, aby te wyniki były przechowywane w localStorage. Problem pojawia się, gdy chcę je sparsować poprzez JSON.parse() do Array. Kod znajduje się poniżej.

$(() => {
  const prompt = $('.prompt');
  const answer = $('.answer');
  const prev = $('.prev');
  let isTrue = false;
  let prevAnswers = [];
  if (localStorage.getItem('prevAnswers')) {
    let prev = localStorage.getItem('prevAnswers');
    prevAnswers = JSON.parse(prev, null);
  }
  let number = parseInt(Math.random()*100);
  
  setInterval(() => {
    const value = answer.val();

    if(isNaN(value)) {
      prompt.text(`${value} isn't a number!`);
    } else {
      if(value != '') {
        if(value < number) {
          prompt.text(`${value} is smaller than number.`);
        } else if(value > number) {
          prompt.text(`${value} is greater than number.`);
        } else if(value == number){
          if (isTrue == false) {
            isTrue = true;
            prompt.text(`${value} is equal to number! Bravo!`);
            setTimeout(() => {
              prompt.text('In 5 seconds I will draw the next number and clear the answer input. In that time I will show the last number below. Have a nice game!');
            }, 2000);

            setTimeout(() => {
              prevAnswers.push(value);
              answer.val('');
              console.log(prevAnswers);
              number = parseInt(Math.random() * 100);

              prev.html('<h2>Previous answers:</h2>');
              for (let i = 0; i < prevAnswers.length; i++) {
                if(i == prevAnswers.length-1) {
                  prev.html(`${prev.html()}${prevAnswers[i]}.`);
                } else {
                  prev.html(`${prev.html()}${prevAnswers[i]}, `);
                }
                
              }
              isTrue = false;
            }, 5000);
          }
        }
      } else {
        prompt.text(`You didn't type a answer. Please type number in input!`);
      }
    }
  }, 100);
});

Problemem jest fakt, że konsola wywala mi błąd związany z 2 argumentem funkcji JSON.parse(), który nie jest mi potrzebny.

1 odpowiedź

0 głosów
odpowiedź 4 listopada 2018 przez Tomek Sochacki Ekspert (227,510 p.)
wybrane 4 listopada 2018 przez ScriptyChris
 
Najlepsza
a co chcesz osiagnac tym nullem jako drugi argument? daj po prostu JSON.parse( data );
komentarz 4 listopada 2018 przez Quetrino Nowicjusz (150 p.)
edycja 4 listopada 2018 przez Quetrino

W przypadku braku null'a dzieje się to samo:

Dodam, że w JSON.parse(prev); nie ma żadnego przecinka ani znaku, który mógłby ten błąd powodować.

komentarz 4 listopada 2018 przez Tomek Sochacki Ekspert (227,510 p.)
a napewno masz tam poprawnego jsona? daj sobie to parsowanie w try catch i w bloku catch wyrzuc na console co siedzi w tym localStorage... bez chocby najprpstszego zdebugowania można tylko zgadywac.
komentarz 4 listopada 2018 przez Quetrino Nowicjusz (150 p.)
Konsola pokazuje, że w localStorage siedzi napis "52,24".
komentarz 4 listopada 2018 przez Tomek Sochacki Ekspert (227,510 p.)
no wiec nie jest to json, po co chces to parsowac? Metoda string.prototype.replace zmien przecinek na kropke i nastepnie np. parseFloat aby dostac typ number.
komentarz 4 listopada 2018 przez Quetrino Nowicjusz (150 p.)
Dziękuje bardzo. Użyłem metody split(',') do utworzenia z napisu tablicy i wszystko działa.
komentarz 4 listopada 2018 przez Tomek Sochacki Ekspert (227,510 p.)

można i split, wszystko zależy co dalej chcesz z tym zrobić, stosując moją metodę od razu dostajesz liczbę:

parseFloat('52,24'.replace(/,/, '.')); // 52.24

 

komentarz 4 listopada 2018 przez Quetrino Nowicjusz (150 p.)
Właśnie problem był tego typu, że wartości 52 i 24 były oddzielnymi liczbami, które użytkownik odgadł w poprzedniej turze i musiałem zachować je obydwie.
komentarz 4 listopada 2018 przez Tomek Sochacki Ekspert (227,510 p.)

no to szczerze mówiąc przecinek nie jest dobrym separatorem... widzisz, ja myślałem, że chodzi o liczę float i pewnie wiele osób tak pomyśli... kod trzeba zawsze pisać z myślą o innych programistach, którzy mogą na nim pracować.

Ja bym tu dał więc po prostu tablicę:

const numbers = [52, 54];
const json = JSON.stringify(numbers);
JSON.parse(json); // [52, 54]

i masz wtedy tablicę, która od razu przechowuje typy number bez żadnych dodatkowych kombinacji. Według mnie jest to dużo czytelniejsze rozwiązanie.

komentarz 4 listopada 2018 przez Quetrino Nowicjusz (150 p.)

Zrobiłem tak samo jak Pan i wszystko teraz działa. Dziękuję za pomoc laugh

Podobne pytania

0 głosów
1 odpowiedź 221 wizyt
pytanie zadane 12 października 2019 w JavaScript przez Paweł Szewczyk Obywatel (1,410 p.)
0 głosów
2 odpowiedzi 830 wizyt
pytanie zadane 29 grudnia 2017 w JavaScript przez revizor451 Obywatel (1,930 p.)
0 głosów
2 odpowiedzi 1,991 wizyt

92,551 zapytań

141,397 odpowiedzi

319,528 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...