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

Porównywanie tablic, czy zawierają takie same elementy

Object Storage Arubacloud
0 głosów
2,031 wizyt
pytanie zadane 6 czerwca 2017 w JavaScript przez niezalogowany

Witam, spróbuję mój problem sprostować do najprostszej sytuacji, a więc... 

jak mogę udowodnić, że tablica:

var array = [1, 2, 3] // może być ["1", "2", "3"] 

zawiera się w tablicy 

var secArray = [1, 5, 3, 4, 2];

 

Próbowałem wykorzystać funkcje some() i indexOf(). Testowałem i próbowałem coś takiego: 

var array = [1, 2, 3]
var secondArray = [1, 5, 3, 4, 2]

var result = array.some(function(options){
	return secondArray.indexOf(options) !== -1;
})

console.log(result); // ale w ten sposób zawsze dostaję true, z oczywistych wzgledow

jsfiddle

Próbowałem również zagnieździć kolejną funkcję do środka, ale wtedy nie porównuję całych tablic, a pojedyncze znaki. 

2 odpowiedzi

+1 głos
odpowiedź 6 czerwca 2017 przez Tomek Sochacki Ekspert (227,510 p.)
wybrane 7 czerwca 2017
 
Najlepsza
let array = [1,2,3],
    secArray = [1,5,3,4,2];

array.every(v=>secArray.includes(v)); //true

array = [1,2,3,6];
array.every(v=>secArray.includes(v)); //false

O coś takiego chodzi?

Ewentualnie opakować to ładniej w funkcję. Pytanie jeszcze jak chcesz traktować sytuację, gdyby w tablicy array były elementy [1,1,2,3] - czy uznajesz, że podwojone elementy traktujemy jako jeden i ten sam (i badamy czy po prostu występuje w tablice secArray) czy też chcesz sprawdzać dokładnie, czyli czy w secArray są co najmniej dwie jedynki?

I kolejna kwestia, czy tablice [1,2,3] i ['1','2','3'] mają się zawierać w Twojej secArray czy tylko pierwsza z nich? Metoda Array.prototype.incudes stosuje operator porównani ścisłego "===", dlatego:

let arrayA = ['1','2','3'],
    arrayB = [1,2,3];

arrayA.every(v=>secArray.includes(v)); //false
arrayB.every(v=>secArray.includes(v)); //true

Pozdrawiam

komentarz 6 czerwca 2017 przez niezalogowany
edycja 6 czerwca 2017
Widzę, że to ES6, a ja jeszcze jestem na ES5, ale ogólnie funkcja every. Potestuję i dam znać. :)
komentarz 6 czerwca 2017 przez Tomek Sochacki Ekspert (227,510 p.)

Jeśli chcesz z ES5 to może coś takiego:

array.every(function(v){
    return ~secArray.indexOf(v);
});

Z użyciem starego, dobrego indexOf :)

komentarz 6 czerwca 2017 przez niezalogowany
Raczej działa, ale nie rozumiem. Miałeś praktycznie identyczny pomysł, a po prostu zamiast some() użyłeś every(), które na pozór działają tak samo. : /
komentarz 7 czerwca 2017 przez ScriptyChris Mędrzec (190,190 p.)

some() i every() nie działają tak samo. Pierwsza metoda zwraca true jeśli w tablicy znajduje się co najmniej jeden element (innymi słowy jakikolwiek), który przejdzie warunek zwracania w funkcji. Druga metoda zwraca true jeśli wszystkie elementy z tablicy przejdą warunek.

0 głosów
odpowiedź 6 czerwca 2017 przez X3h Dyskutant (9,540 p.)
Zrób przecięcie array i secondArray jako A. Złącz array i A po czym usuń powtórzenia jako B. Jeśli długość B wynosi zero wttw array zawiera się w secondArray.
komentarz 6 czerwca 2017 przez Tomek Sochacki Ekspert (227,510 p.)
Tylko pytanie po co w ten sposób kombinować i kilka razy analizować zawartość tablic?
komentarz 6 czerwca 2017 przez X3h Dyskutant (9,540 p.)
Zawsze warto mieć w podręcznej kilka sposobów na rozwiązanie jednego problemu. Może i teraz lepiej jest wybrać ten bardziej intuicyjny proces rozumowania ale podczas testów jednostkowych wychodzą na jaw niedoskonałości z kompatybilnością jaka wynikała z założeń. Niechęć do kombinowania czyli sprawdzania co jeśli doprowadza do trywialnych błędów.
komentarz 7 czerwca 2017 przez Tomek Sochacki Ekspert (227,510 p.)
kombinowanie i dążenie do optymalizacji jak najbardziej, szczególnie w bardziej złożonych algorytmach obliczeniowych, ale nie przesadzajmy z kombinowaniem w tak prostych czynnościach.

ale co by nie mówić, to jeśli ktoś się dopiero uczy programowania to parę możliwości więcej na rozwiązanie jakiegoś algorytmu nigdy nie zaszkodzi :) lepiej mieć na problem więcej pomysłów niż potrzeba niż za mało :)

pozdrawiam

Podobne pytania

0 głosów
2 odpowiedzi 281 wizyt
pytanie zadane 13 września 2018 w JavaScript przez Kalif Użytkownik (640 p.)
+1 głos
1 odpowiedź 247 wizyt
0 głosów
2 odpowiedzi 3,253 wizyt
pytanie zadane 12 listopada 2016 w C# przez Neronys Bywalec (2,090 p.)

92,550 zapytań

141,394 odpowiedzi

319,522 komentarzy

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

...