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

JS - optymalizacja pętli wyszukujące pierwszy element

Object Storage Arubacloud
0 głosów
211 wizyt
pytanie zadane 18 września 2018 w JavaScript przez MrxCI Dyskutant (8,260 p.)

istnieje tablica obiektów

arr = [{is:false},}{is:false},{is:true},{is:false}];

I pętla która ma za zadanie wykonać funkcję na pierwszym obiekcie w tablicy spełniającym warunek.

let stop=false


for(i=0,i<arr.length && stop===false,i++)
{

 if(arr[i].is === true){

  execute(i); // jakies dzialania na tym obiekcie... np. wykonanie funkcji
  stop = true;

 }

}

Czy powyższa pętla jest optymalna? Jak można to przyszpieszyć bądź zoptymalizować lepiej?

 

I czy trzymanie obiektów w tablicach jest dobrym pomysłem?

2 odpowiedzi

+3 głosów
odpowiedź 18 września 2018 przez Tomek Sochacki Ekspert (227,510 p.)
wybrane 19 września 2018 przez MrxCI
 
Najlepsza

Załóżmy, że mamy taką tablicę:

const arr = [
  {is:false, val: '1'},
  {is:false, val: '2'},
  {is:true, val: '3'},
  {is:false, val: '4'},
  {is:true, val: '5'}
];

i przykład rozwiązania tego z pętlą for:

for(let i = 0; i < arr.length; i += 1) {
  const elem = arr[i];
  if (elem.is === true) {
    console.log(elem.val);
    break; // koniec pętli
  }
}

// 3

albo np. z metodą Array.prototype.find

const firstElement = arr.find(elem => elem.is === true);

if (firstElement) {
  console.log(firstElement.val);
}

// 3

Generalni nie patrz też mega na wydajność itp. bo w praktyce w większości sytuacji takich pętli na małych tablicach nie ma to znaczenia, i tak często stara wydajnościowa leży w zupełnie innych miejscach, dużej abstrakcji itp. itd. Zawsze jednak trzeba poszukiwać kompromisu między wydajnością, a prostotą developmentu i łatwością utrzymania kodu.

Możesz robić mega super zoptymalizowaną logikę, ale za chwilę może się okazać, że przyjdzie Ci wdrażać w ten kod jakiegoś juniora i co wtedy... ja stosuję raczej zasadę, że lepiej czasem nieco stracić na wydajności ale zyskać na czytelności i prostocie utrzymania oraz wdrażania się nowych osób.

W powyższych przypadkach celowo zrobiłem jawne przyrównanie do boolean zamiast po prostu id(elem.is) bo jest to tylko przykład aby jawnie wskazać Ci sposób i miejsce porównywania.

komentarz 19 września 2018 przez ShiroUmizake Nałogowiec (46,300 p.)
Pętlą for of by nie było szybciej zaciągając tylko konrektne pole?
+1 głos
odpowiedź 18 września 2018 przez k.wichura Pasjonat (19,870 p.)
edycja 18 września 2018 przez k.wichura
arr = [
  {is:false},{is:false},{is:true},{is:false}];

const x = arr.filter((el) => el.is === true);

zrobCos(x);

Można tak, ale nie widze też problemu w twoim rozwiązaniu. Jest ok. Jedynie flaga jest niepotrzebna. Zamiast tego stop daj break po wykonaniu execute.

 

Trzymanie obiektów w tablicy jest ok.

komentarz 18 września 2018 przez Tomek Sochacki Ekspert (227,510 p.)
Ale metoda filter tutaj jest bez sensu. Zauważ, że autor chce wywołać jakąś akcję tylko dla pierwszego elementu, a Ty w tablicy x będziesz miał wszystkie, które spełnią warunek. W tym akurat przypadku danych wejściowych to będzie jeden element ale jest to zbyt duże zaufanie do jakości danych input i w kodzie produkcyjnym szybko by wywaliło jakieś incydenty i błędy.
komentarz 18 września 2018 przez k.wichura Pasjonat (19,870 p.)
Co racja, to racja. Dałem to tak na szybko, żeby pokazać, że da się inaczej. Jego rozwiązanie jest ok. Tak jak napisałem. (Chociaż, zawsze można zrobić pętlę po wyniku filtra i wykonywać execute na wszystkich elementach :D)

Rozwiązanie z find trafniejsze ;)
1
komentarz 18 września 2018 przez Tomek Sochacki Ekspert (227,510 p.)

Chociaż, zawsze można zrobić pętlę po wyniku filtra i wykonywać execute na wszystkich elementach

Dlatego zawsze trzeba dokładnie analizować założenia i sprawdzić, czy na pewno będzie nas interesować wyłącznie pierwszy znaleziony element, czy może wszystkie. Już nie raz przekonałem się, że pierwotne założenia biznesowe nagle potrafią się drastycznie zmienić, ale nie zawsze  przewidzisz co wymyślą managerowie z góry :)

Podobne pytania

0 głosów
1 odpowiedź 123 wizyt
pytanie zadane 18 listopada 2018 w JavaScript przez ptaku19 Użytkownik (800 p.)
0 głosów
0 odpowiedzi 149 wizyt
pytanie zadane 5 listopada 2016 w JavaScript przez niezalogowany
0 głosów
1 odpowiedź 144 wizyt
pytanie zadane 27 maja 2020 w JavaScript przez boneoflive Użytkownik (930 p.)

92,552 zapytań

141,399 odpowiedzi

319,534 komentarzy

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

...