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

Szukanie liczby w tablicy JS

Object Storage Arubacloud
0 głosów
2,882 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,510 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,510 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,010 p.)
komentarz 23 lipca 2017 przez Tomek Sochacki Ekspert (227,510 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,510 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,510 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,510 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 664 wizyt
0 głosów
1 odpowiedź 1,823 wizyt
pytanie zadane 28 sierpnia 2018 w C i C++ przez supergosc44 Początkujący (270 p.)
+1 głos
1 odpowiedź 816 wizyt

92,556 zapytań

141,404 odpowiedzi

319,560 komentarzy

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

...