• 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

VPS Starter Arubacloud
0 głosów
253 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,490 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,490 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,490 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ź 148 wizyt
pytanie zadane 18 listopada 2018 w JavaScript przez ptaku19 Użytkownik (800 p.)
0 głosów
0 odpowiedzi 161 wizyt
pytanie zadane 5 listopada 2016 w JavaScript przez niezalogowany
0 głosów
1 odpowiedź 170 wizyt
pytanie zadane 27 maja 2020 w JavaScript przez boneoflive Użytkownik (930 p.)

93,008 zapytań

141,975 odpowiedzi

321,256 komentarzy

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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...