hej
chce otrzymac flatten array z drzewiastej struktury z odniesieniami do rodzica w id, bez hierarchii rodzic dziecko, chce zeby to byla "pure function" bez instrukcji push...
Rzecz w tym, że to nie kwestia pusha, tylko tego czy w swojej funkcji mutujesz coś z zewnątrz. Pomijając już kwestię, czy mutowałeś coś niechcący w środku (swoją drogą JS to słaby język do programowania funkcyjnego, , to wersja z twojego pierwszego posta w samych założeniach nie była "pure function", ponieważ mutowałeś zmienną globalną flattenarr
:
let flattenarr = [];
const treetoarr = (flattenarr, tree, i) => {
tree.map((t, ii) => {
flattenarr = [
Z drugiej strony może istnieć czysta funkcja, która będzie mieć push w środku. Zobacz na funkcję treetoarr
zaimplementowaną tak:
const treetoarr = (tree) => {
const flattenarr = []; // nowiutka tablica
const withoutChildren = ({children, ...rest}) => ({...rest}); // kopiujemy obiekt bez children
// pomocnicza funkcja rekurencyjna (która jest imperatywna/nie czysta)
// bo mutuje tablicę flattenarr, ale co z tego,
// skoro nie wychodzi to poza granice funkcji treetoarr
function flatten(node) {
flattenarr.push(withoutChildren(node)); // dodajemy do nowiutkiej tablicy
(node.children || []).forEach(flatten); // iterujemy w głąb (rekurencja)
}
flatten(tree);
return flattenarr; // zwracamy nowiutką tablicę
};
I też można ją nazwać czystą, bo sama sobie tworzy tablicę flattenarr
i robi na niej push, ale przecież to jej własna tablica. Chodzi o to, że ten push to będzie tutaj tylko szczegół implementacyjny (funkcja w środku ma imperatywny kod, ale i tak jest czysta, bo nic nie mutuje tj: wyobraź sobie takie dwie funkcje:
const foo = arg => {
return ["Hello"].concat("World");
};
const bar = arg => {
const tmp = [];
tmp.push("Hello");
tmp.push("World");
return tmp;
};
czy jest między nimi jakaś wielka różnica? No nie. Poza tym, że używają innych funkcji, to obie można uznać za czyste. Druga używa push, ale co z tego, skoro robi to na tablicy, którą sama tworzy.
Nie ma co wpadać w cargo cult - czyste funkcje nie polegają na tym, żeby wrzucać map, concat i reduce czy ...
bez pomyślenia, bo ktoś tak powiedział, że push jest złe.
Nie mówię oczywiście, że push nigdy się nie kłóci z czystymi funkcjami, tylko żeby spojrzeć na to w ten sposób, że czysta funkcja to jest to https://en.wikipedia.org/wiki/Pure_function a nie zakaz używania pewnych funkcji.