Tablica

0

Cześć wszystkim, zaczynam się uczyć js, czy wiecie dlaczego shift nie nie potrafi przeżucić moich parzystych liczb do newTable? a pokazuje mi liczbe 7.

const numbers = [2, 5, 7, 10, 34, 16, 879, 1]
let newTable = []

    for (let i = 0; i < 8; i++) {
        if (((numbers[i] % 2) == 0)) {
            console.log(`parzysta ${i}`)
            newTable = numbers.shift()
                       }
    }
2

Dzieje się tak ponieważ .shift() modyfikuje oryginalną tablicę, więc podczas jego użycia oryginalna tablica jest skracana i wszystkie indeksy przesuwają sie w lewo. Dodatkowo używając .shift() wyciągasz z tablicy pierwszy element, a nie bieżący (i nie dodajesz go do nowej tablicy, tylko zastępujesz zmienną newTable tym elementem).

Co do rozwiązania - chcesz by w oryginalnej tablicy zostały tylko liczby nieparzyste, czy też może ona zostać niezmieniona?

0

zgadza się, chciałem aby oryginalna tablica miała nieparzyste elementy zaś tablica newTable posiadała parzyste

4

Ok, w takim razie potrzebujesz raczej metody .splice(), która wycina z tablicy dowolne elementy. Pętla for też tu bardziej przeszkadza niż pomaga, bo musisz przesuwać indeks do przodu tylko wtedy gdy element nie został wycięty, tu masz przykładowe rozwiązanie za pomocą .splice() i pętli while (i .push() do dodawania elementów do tablicy):

let i = 0

while (i < numbers.length) {
  if(numbers[i] %2 === 0) {
    // Wycinamy fragment tablicy o długości 1 od bieżącego indeksu
    // i bieżemy pierwszy element tego wycinka
    const num = numbers.splice(i, 1)[0]
    // dodajemy element na koniec nowej tablicy
    newTable.push(num)
  } else {
    // inkrementujemy indeks tylko jeśli nie wycieliśmy elementu
    i++
  }
}

Czytelniejszym rozwiązaniem byłoby zrobienie tego bez modyfikacji oryginalnej tablicy (nie musisz wtedy w ogóle pilnować indeksów):

const original = [2, 5, 7, 10, 34, 16, 879, 1]
const even = original.filter(x => x % 2 === 0)
const odd = original.filter(x => x % 2 !== 0)

Lub żeby nie iterować dwukrotnie (co ma znaczenie przy bardzo dużych tablicach):

const original = [2, 5, 7, 10, 34, 16, 879, 1]
const even = []
const odd = []

original.forEach(x => {
  if (x % 2 === 0) {
    even.push(x)
  } else {
    odd.push(x)
  }
})

Ogólnie sposobów jest miliord.

1

Dziękuje bardzo za pomoc, otwarłeś mi oczy teraz. Dużo cennych uwag

0

Przepraszam najmocniej mam ostatnie pytanie, dotyczące indexu [0], po metodzie splice()[0] ponieważ bez niego tworzą się elementy [Array(1), Array(1), Array(1), Array(1)], jaki tu zachodzi proces?

0

Nie jestem pewny ale doczytałem że jest to sposób na pobranie z tablicy (elemntu liczbowego) i dzięki temu możemy włożyć do nowej tablicy, czy ta racja ma prawo bytu?

2

jaki tu zachodzi proces?

Spójrzmy do dokumentacji:

https://developer.mozilla.org/pl/docs/Web/JavaScript/Referencje/Obiekty/Array/splice

Metoda splice zwraca tablicę zawierającą usunięte elementy. Jeżeli usunięty został tylko jeden element, zwracana jest tablica jednoelementowa.

0

teraz zrozumiałem, dzięki zadaniom wychodzą kruczki, które wcześniej nie dojrzałem w suchej teorii, dziękuje bardzo!)

1 użytkowników online, w tym zalogowanych: 0, gości: 1