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

Szukanie liczby w tablicy JS

Cloud VPS
0 głosów
3,551 wizyt
pytanie zadane 23 lipca 2017 w JavaScript przez modest Nowicjusz (210 p.)

Hej

Mam za zadanie sprawdzić czy dana liczba występuje w tablicy. 

np. getNumber(2, [33, 54, 2, 1, 4, 100]) => true

Kombinuję coś takiego:

var tab = [1,2,3,4,5];
var numb = 0;
var getNumber = function(numb,tab){
  for( var i = 0; i < tab.length; i++){
      if (numb == tab.length){
        return true;
      }else{

       return false;
  }
console.log(getNumber);
}

 

komentarz 24 lipca 2017 przez Tomek Sochacki Ekspert (227,490 p.)

A tak na marginesie to kod wstawiamy w blok CODE :)

3 odpowiedzi

+2 głosów
odpowiedź 23 lipca 2017 przez Tomek Sochacki Ekspert (227,490 p.)
edycja 23 lipca 2017 przez Tomek Sochacki

A musisz używać do tego pętli (chodzi mi o to, czy masz to jasno napisane w zadaniu), bo jeśli nie to może coś takiego:

const getNumber = function ( num, arr ) {
    return arr.includes( num );
}

getNumber( 2, [33, 54, 2, 1, 4, 100] );   //true
getNumber( 555, [33, 54, 2, 1, 4, 100] ); //false

ewentualnie, jeśli koniecznie ma być pętla for to np.:

const getNumber = function ( num, arr ) {
	for ( let i = 0; i < arr.length; i += 1 ) {
		if ( arr[i] === num ) {
			return true;
		}
	}
	return false;
}

 

komentarz 23 lipca 2017 przez modest Nowicjusz (210 p.)
W sumie pętla nie jest konieczna, ale dopiero zaczynam zabawę z js i inna kombinacja za bardzo nie przychodziła mi do głowy. Dzięki za pomoc
0 głosów
odpowiedź 23 lipca 2017 przez Velta Maniak (52,830 p.)
komentarz 23 lipca 2017 przez Tomek Sochacki Ekspert (227,490 p.)
Z metodą indexOf trzeba pamiętać, że w przypadku nie znalezienia elementu zwraca ona -1, natomiast dla elementu num, znajdującego się na pierwszej pozycji w array zwróci zero, co przy niewłaściwym zapisaniu warunku sprawdzającego może dać false (zero w JS jest niejawnie konwertowane do false).

Dlatego bezpieczniejszą i bardziej elegancką formą jest wg mnie użycie Array.prototype.includes dającej nie indeks, ale wartość true/false.
komentarz 24 lipca 2017 przez Magicone Nałogowiec (45,100 p.)
ta metoda weszła dopiero w ES7, nie wiem czy można ją aż tak mocno rekomendować
komentarz 24 lipca 2017 przez Tomek Sochacki Ekspert (227,490 p.)
Z tego co wiem to ES7 jeszcze nie jest chyba ostatecznie zatwierdzone, ale includes działa bez problemu. W dobie i tak powszechnego używania transpilacji kodu i odpowiedniego podgrywania polyfill nie martwiłbym się bardzo o to, z jakiej wersji ES pochodzi dana metoda.

A po za tym czasami środowisko masz stałe i masz kontrolę nad tym jakie metody są obsługiwane, np. jeśli korzystasz z node.

Jeśli ktoś chce być całkowicie zgodny ze starymi wersjami ES to dałem drugie rozwiązanie, wystarczy zmienić "const i let" na "var" i odpali się chyba w każdym środowisku ES :)
komentarz 24 lipca 2017 przez Tomek Sochacki Ekspert (227,490 p.)
a tak dla ciekawych co nowego w es7 :)

http://exploringjs.com/es2016-es2017/
1
komentarz 24 lipca 2017 przez Magicone Nałogowiec (45,100 p.)
ES7 jest zatwierdzone już od ponad roku, ta metoda nie ma dużego wsparcia z tego co mówi mdn, a ty na siłę próbujesz unikać dobrego rozwiązania z indexOf implementując w swojej alternatywie to samo, co natywnie jest ładniejsze i szybsze.
komentarz 24 lipca 2017 przez Tomek Sochacki Ekspert (227,490 p.)

Niczego nie chcę na siłę komuś wciskać, po prostu wyrażam swoją opinię - od tego chyba jest właśnie forum (forum to chyba właśnie wymiana opinii...? :)

Ale skoro już się bawić to na całego :)

pierwsza wersja:

const getNumber = function ( num, arr ) {
    return arr.indexOf( num ) !== -1;
}
 

druga wersja:

const getNumber = function ( num, arr ) {
    return !!~arr.indexOf( num );
    //tylda to bitowy operator NOT
}
 

trzecia wersja:

const getNumber = function ( num, arr ) {
    return arr.some( val => {
        return val === num;
    } )
}
 

czwarta wersja:

const getNumber = function ( num, arr ) {
    const count = arr.filter( val => {
        return val === num;
    } );
    return count.length > 0;
}

 

piąta wersja:

const getNumber = function ( num, arr ) {
    for ( const val of arr ) {
        if ( val === num ) {
            return true;
        }
    }
    return false;
}

+ dwa moje pierwsze warianty to mamy łącznie siedem koncepcji :)

Oczywiście nie należy ich traktować poważnie, sam się sobie dziwię, że wpadł mi do głowy pomysł użyciu tutaj Array.prototype.filter ale no cóż... :P

 

Chciałem tylko pokazać jak wiele jest różnych sposobów osiągnięcia celu i w programowaniu często są takie sytuacje. A to która metoda jest najlepsza to niech już każdy sobie sam oceni i wybierze wedle uznania.

 

Co do wsparcia różnych metod to nie dramatyzowałbym aż tak, ponieważ jak już pisałem wszystko zależy od tego w jakim środowisku pracujemy. Jeśli np. piszemy w node to wiemy jaką mamy wersję i co ona "potrafi" więc możemy zająć się stricte algorytmami. W przypadku środowiska przeglądarek niestety faktycznie różnie to bywa...

0 głosów
odpowiedź 24 lipca 2017 przez Radekol Bywalec (2,880 p.)
Dlaczego porównujesz zmienną numb do długości tablicy?

 Porównując w js, używaj === zamiast ==, porównasz wtedy też typy zmiennych.

Poczytaj sobie o funkcji for each, bo jej bym właśnie użył do tego zadania.

Podobne pytania

0 głosów
2 odpowiedzi 975 wizyt
0 głosów
1 odpowiedź 2,166 wizyt
pytanie zadane 28 sierpnia 2018 w C i C++ przez supergosc44 Początkujący (270 p.)
+1 głos
1 odpowiedź 917 wizyt

93,454 zapytań

142,448 odpowiedzi

322,717 komentarzy

62,832 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

Kursy INF.02 i INF.03
...