Skip to content

Instantly share code, notes, and snippets.

@samilkahraman
Last active January 9, 2021 18:14
Show Gist options
  • Save samilkahraman/712749f773e20c4ea727cdecca95ab4c to your computer and use it in GitHub Desktop.
Save samilkahraman/712749f773e20c4ea727cdecca95ab4c to your computer and use it in GitHub Desktop.
data tree creation
const createDataTree = (dataset) => { // dataset - parentID ve id içeren objelerle dolu
const storehousesAsTree = []; // apinin geri döneceği array
let depth = 0; // başlangıç ağaç derinliğimiz
for (let i = 0; i < dataset.length; i += 1) { // bu döngünün amacı birden fazla root olma durumu içindir. Farklı ağaçlar oluşturmaktadır.
if (dataset[i].parentID === 0) { // Parent ID'si default 0 olanın parentı yok demektir ve Root kategoridir.
const parentID = dataset[i].id;
const tree = new Tree(); // Bulduğumuz elemanın root olduğu Treemizi oluşturuyoruz.
tree.add(dataset[i]); // add metodu tek parametre alırsa eklenen eleman root demektir.
const filteredDataSet = dataset.filter((el) => el.id !== parentID); // Bu filtreleme işlemi datasetten, ağaca eklediğimiz elemanı çıkarmak için
depth = findChilds(filteredDataSet, parentID, tree, 1); // ağacın rootunu yardımcı metodumuza gönderiyoruz ve o recursive olarak çocuklarını buluyor.
storehousesAsTree.push(tree); // tamamlandığında geri dönülecek arrayimize pushluyoruz ve diğer rootlar için bu işlem tekrarlanıyor
}
}
return { storehousesAsTree, depth };
};
const findChilds = (reducedDataSet, parentID, tree, depth) => {
if (reducedDataSet.length === 0) return;
// parentID'si seçilip, arrayden çıkarıldı ve kalan array içerisinde gezildi
for (let i = 0; i < reducedDataSet.length; i += 1) {
// Eğer azalan arrayda parent id'si gelen parent idye eşit varsa buraya girdi
if (reducedDataSet[i].parentID === parentID) {
// treede eşleşen parent child yerleştirilmesi yapıldı
tree.add(reducedDataSet[i], parentID);
// çocuk yeni parent seçildi çünkü çocuğun da çocuğu olabilir
const newParentID = reducedDataSet[i].id;
// çocuk arrayden çıkarıldı
const newreducedDataSet = reducedDataSet.filter(
(el) => el.id !== newParentID
);
findChilds(newreducedDataSet, newParentID, tree, depth);
// eslint-disable-next-line no-param-reassign
depth += 1;
}
}
// eslint-disable-next-line consistent-return
return depth;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment