Do końca nie wiem skąd w Twoim rozwiązaniu by się brały i oraz j? Wnioskuję, że zostawiamy poniższe pętle, a Twój drugi blok kodu umieszczamy w środku?
tak, moje rozwiązanie dotyczyło tylko zamiany tej wewnętrznej pętli for (let f = 0; f < forbiddenCells.length; f++) {.......}
na .find
, a dwie pozostałe pętle for by zostały tak, jak napisałeś (i z nich by było i
oraz j
tak jak teraz masz).
Ale moim zdaniem, jakbym ja to pisał, to tak:
-
logika chodzenia po mapie powinna być oddzielona od reszty aplikacji. Czyli jeśli masz jakieś pętle for, czy cokolwiek innego (.find
, .reduce
czy jakiekolwiek inne rozwiązanie), to aplikacja o tym nie powinna wiedzieć. To powinien być szczegół implementacyjny obiektu reprezentującego mapę, który mógłby udostępniać metody do manipulacji nią. Wtedy nawet jak będziesz mieć trochę brzydki kod, to nie będzie miało to aż takiego znaczenia, jeśli zrobisz dobrą enkapsulację. Bo ten brzydki kod będzie w jednym miejscu (i będzie można później łatwo go poprawić bez przerabiania całej aplikacji)
-
zwykle nie trzymam danych tego typu mapy w postaci wielowymiarowej tablicy, tylko bardziej robię coś w stylu słownika (gdzie kluczem są współrzędne x, y np.
const map = Object.create(null); // pusty obiekt, który nie dziedziczy znikąd (bo np. {} dziedziczy domyślnie z Object)
map[x + ";" + y] = something;
// albo uzywajac obiektów Map
const map = new Map();
map.set(x + ";" + y, something);
Tym sposobem nie jestem zależny od wymiarów (i mapa może być duża w rozmiarze, ale mieć mało obiektów itp.).
Plus łatwiej można iterować
const map = Object.create(null);
for (let k in map) {..... }
Object.keys(map).forEach(......)
albo
const map = new Map();
for (let [key, value] of map.entries()) {........ }
dodatkowo tak jak napisałem - zrobiłbym to tak, żeby odizolować samą logikę mapy. Ale również do tworzenia kluczy też bym wydzielił prywatną funkcję typu getKey, która by robiła nawet to głupie x + ";" + y, żeby nie powtarzać tej logiki.
Ogólnie chodzi o to, żeby od strony aplikacji obsługa tego byłaby prosta. Żeby od strony aplikacji nie robić takiego czegoś:
this.boardP1[i][j].
tylko bardziej
this.boardP1.getCell(i, j);
no i ta cała funkcja private compareBoardWithForbiddenCells
powinna być częścią samej mapy, a nie komponentu (tzn. nie wiem, czy to komponent, ale w tytule wątku jest "angular"). Komponent nie powinien się zajmować szczegółami technicznymi mapy.
Innymi słowy - napisałbym to w OOP, stosując enkapsulację.