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

duze litery obok siebie. pusta tablia mimo .push

Object Storage Arubacloud
+1 głos
158 wizyt
pytanie zadane 28 września 2020 w JavaScript przez konradnet Nowicjusz (160 p.)

witam wszystkich, naprawde zaciąłem się przy zadaniu sprawdzającym czy dany string zawiera tylko łacińskie litery i czy nie ma dwóch dużych/małych liter tuż obok siebie. zalozylem taki plan:
1.sprawdź czy string zawiera tylko łacińskie znaki. 
2. sprawdz czy sa duze litery
3. umieść .indexof dużych liter do tablicy
4. użyj .map do tablicy aby znaleźć różnice indexof, czyli gdy różnica wyniesie 1, to znaczy ze dwie duże litery są obok siebie. 
5. sprawdź to samo dla malych liter

A wiec, gdy próbuje wrzucić pozycje liter do tablicy (punkt 3),console.log zwraca mi pusta tablice. Próbowałem tu .concat, .push, pętle - i nic nie działa. 

 bez tego nie mogę przejść dalej.
Proszę o jakieś porady. 

const task101 = () => {
  const task101in = document.querySelector("#task101in").value;
  const t101ans = document.querySelector("#task101ans");
  const another = [];
  //if length of string is not the same as length of latin letters
  if ((task101in.match(/[a-zA-Z]/g) || "").length != task101in.length) {
    t101ans.textContent = `Non Latin letters, try again`;
  } else {
    //looking for uppercase letters
    for (let i = 0; i < task101in.length; i++) {
      //check index of uppercase
      const indexNum = task101in.indexOf(task101in[i].match(/[A-Z]/g));
      //trying to push indexof numbers to an array
      for (let y = 0; y <= indexNum.length; y++) {
        // const another = [];
        another = another.push(indexNum)
        return another
      }
      t101ans.textContent += indexNum
    }
  }
};
document.querySelector("#task101").addEventListener("click", task101);

 

komentarz 28 września 2020 przez ScriptyChris Mędrzec (190,190 p.)

Czy w konsoli są jakieś błędy? Jaką wartość ma zmienna indexNum - może pętla się nie wykonuje? Metoda push zwraca nową długość tablicy, więc w 16 linii przypisujesz do zmiennej another liczbę, a nie tablicę.

komentarz 28 września 2020 przez konradnet Nowicjusz (160 p.)

dziękuję za zainteresowanie :)

w konsoli nie mam zadnych bledów, i świadomie wybrałem push aby uzyskać tablice. dzięki temu,gdy wpisze w input na przyklad: ABab, uzyskam upperCase/lowerCase indexy (czyli wartosci indexNum) 0,1,-1,-1. i te wszystkie cyfry chce umieścić w tablice another[] aby sprawdzić roznicę pomiedzy indexami:

const roznica = another.map((items, i)=> another[0]- another[i+1]);

komentarz 28 września 2020 przez ScriptyChris Mędrzec (190,190 p.)

 gdy wpisze w input na przyklad: ABab, uzyskam upperCase/lowerCase indexy (czyli wartosci indexNum) 0,1,-1,-1. i te wszystkie cyfry chce umieścić w tablice another[] aby sprawdzić roznicę pomiedzy indexami

To chyba nie potrzebna Ci ta druga pętla. Po prostu pushuj zmienną indexNum do tablicy.

const indexNum = task101in.indexOf(task101in[i].match(/[A-Z]/g));
another.push(indexNum);

 

1 odpowiedź

+1 głos
odpowiedź 28 września 2020 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 28 września 2020 przez konradnet
 
Najlepsza
      const indexNum = task101in.indexOf(task101in[i].match(/[A-Z]/g));
      //trying to push indexof numbers to an array
      for (let y = 0; y <= indexNum.length; y++) {

Zmienna indexNum jest liczbą, a nie tablicą, więc nie posiada property length (zapis indexNum.length powinien zwracać undefined). Więc ta pętla się nie wykonuje.

świadomie wybrałem push aby uzyskać tablice

Ale push nie tworzy tablicy, tylko dodaje elementy do jej końca, zwracając nową długość tablicy. 

komentarz 28 września 2020 przez konradnet Nowicjusz (160 p.)
Dzięki Tobie poprobowalem, usunalem jedna petle, sprawdzilem co pokazują console.logi. mam zwrócona tablice i moge zrobic na tym .map.  a więc sukces.

Rezultat jest taki ze wybralem zly sposob na odróżnienie małych/dużych liter obok siebie. planowany ABcd zwraca mi -1,1,1 a AbCd 1,-2,1. A wiec caly misterny plan... zarówno roznice  malych jak i duzych liter zwracają jedynki...
1
komentarz 28 września 2020 przez ScriptyChris Mędrzec (190,190 p.)

O ile dobrze Cię rozumiem, to chcesz mieć tablice z indeksami dla dużych i małych liter ze słowa. Można to zrobić jedną pętlą pushującą indeks znaku do jednej (duże litery) lub drugiej (małe litery) tablicy. Ewentualnie bawić się RegExpami (np. metoda search).

const string = 'ABcdeFgH';

const upperCaseIndexes = [];
const lowerCaseIndexes = [];

for (let i = 0; i < string.length; i++) {
  const char = string[i];

  if (char.toUpperCase() === char) {
    upperCaseIndexes.push(i);
  } else {
    lowerCaseIndexes.push(i);
  }
}

console.log(upperCaseIndexes); // (4) [0, 1, 5, 7]
console.log(lowerCaseIndexes); // (4) [2, 3, 4, 6]

 

komentarz 29 września 2020 przez konradnet Nowicjusz (160 p.)

dziekuje za calosc. rzeczywiscie prosciej i poprawniej pokazales mi jedno rozwiazan.
cały kod działa, ale czy jest to w pewnym sensie "neat code" czy bardziej smieć?

calosc ubralem w cos takiego: 

//check whether a given string contains only Latin letters and no two uppercase and no two lowercase letters are in adjacent positions.

const task101 = () => {
  const task101in = document.querySelector("#task101in").value;
  const t101ans = document.querySelector("#task101ans");
  const upperCaseIndexes = [];
  const lowerCaseIndexes = [];
  //if length of string is not the same as length of latin letters
  if ((task101in.match(/[a-zA-Z]/g) || "").length != task101in.length) {
    t101ans.textContent = `Non Latin letters, try again`;
  } else {
    //looking for uppercase letters
    for (let i = 0; i < task101in.length; i++) {
      //pasja inf podpowiedz.
      //check index of upper/lowerCase inside string
      const char = task101in[i];
      if (char.toUpperCase() === char) {
        upperCaseIndexes.push(i);
      } else {
        lowerCaseIndexes.push(i);
      }
      //upper/lower indexes are pushed inside array
      //check how close the sameCase letters are
      const upperCase = upperCaseIndexes.map(
        (items, i) => upperCaseIndexes[0] - upperCaseIndexes[i + 1]
      );
      const lowerCase = lowerCaseIndexes.map(
        (items, i) => lowerCaseIndexes[0] - lowerCaseIndexes[i + 1]
      );
      if (upperCase.includes(1) || upperCase.includes(-1)) {
        t101ans.textContent = "There are same letters written adjacent";
      } else {
        t101ans.textContent = "No same case letters are written adjacent";
      }
      console.log(upperCase);
      console.log(lowerCase);
    }
  }
};
document.querySelector("#task101").addEventListener("click", task101);

 

komentarz 29 września 2020 przez ScriptyChris Mędrzec (190,190 p.)

czy jest to w pewnym sensie "neat code" czy bardziej smieć?

Pytasz co można poprawić w powyższym kodzie?

komentarz 2 października 2020 przez konradnet Nowicjusz (160 p.)
tak, czy można coś poprawić w powyższym kodzie? co zrobić aby był czysty?

pozdrawiam
1
komentarz 2 października 2020 przez ScriptyChris Mędrzec (190,190 p.)

Poprawiłbym nazewnictwo - np. nazwa funkcji task101 ani zmiennych task101in/task101ans nic nie mówią o sobie. Jeśli po if..else w 9 i 11 linijkach nie ma dalej kodu, to w if dałbym return i zrezygnował wtedy z else, który i tak się nie wykona (zawsze jedno zagnieżdżenie do czytania w kodzie mniej). Zamiast przypisań w liniach 30 i 32 można pokusić się o użycie ternarki. Komentarze opisujące co robi kod są raczej zbędne - jeśli używa się komentarzy, to bardziej to opisania dlaczego coś się dzieje tak a nie inaczej (np. obejście buga lub dziwnego przypadku w kodzie lub zostawienie TODO itd.); wg mnie można opisać kod, jeśli np. ze względów wydajnościowych nie został podzielony na mniejsze fragmenty i trudno jest w krótkim czasie ogarnąć co się w nim dzieje; kod powinien być możliwe samo-opisujący się (prowadzi do tego m.in. czytelne nazewnictwo zmiennych, funkcji, klas).

Czemu ma służyć mapowanie w liniach 24 i 27?

komentarz 2 października 2020 przez konradnet Nowicjusz (160 p.)

wybralem mapowanie aby sprawdzic roznice w indexach. moze to dziwny sposob na to zadanie. ale obliczajac roznize indexow duzych/malych liter w stringu, moge latwo okreslic czy dwie litery tej samej wielkosci sa obok siebie. na przykład, według Twojego przykładu:
 jezeli w wyniku mapowania bedzie: 1 lub -1, to znaczy ze duze lub male litery sa obok siebie. 

const string = 'ABcdeFgH';
console.log(upperCaseIndexes); // (4) [0, 1, 5, 7]
console.log(lowerCaseIndexes); // (4) [2, 3, 4, 6]

nie patrzylem na inne rozwiazania w necie, wiec pomsl moze być dla Ciebie dziwny.
pozdrawiam

1
komentarz 2 października 2020 przez ScriptyChris Mędrzec (190,190 p.)

Przyległość liter możesz sprawdzić RegExpem:

const string = 'ABcdeFgH';
const hasAdjacentUpperCaseLetters = /[A-Z][A-Z]/.test(string);
const hasAdjacentLowerCaseLetters = /[a-z][a-z]/.test(string);

Jeśli potrzeba Ci indexu pierwszej pary liter przyległych, to użyj metody search z tym samym RegExpem.

 

Podobne pytania

0 głosów
1 odpowiedź 1,973 wizyt
pytanie zadane 10 września 2019 w JavaScript przez 42savage Bywalec (2,630 p.)
0 głosów
2 odpowiedzi 168 wizyt
pytanie zadane 29 listopada 2016 w PHP przez hiper007 Stary wyjadacz (11,270 p.)
+2 głosów
1 odpowiedź 301 wizyt

92,565 zapytań

141,418 odpowiedzi

319,604 komentarzy

61,952 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!

...