Obsluga obiektow wielowymiarowych

0

Zalozmy ze mam sobie taki kod:

let obj = {}
obj.poss ={a:{}, b:{}}
obj.poss[a].poss = {c:{}, d:{}}
obj.poss[b].poss - {e:{}, f:{}}


teraz zeby sie do wszystkiego odwolac musze napisac:

for(let key of Object.keys(obj.poss)
{
  for(let key2 of Object.keys(obj.poss[key].poss)
  {
    
  }
}

I tak dalej im wiecej mozliwosci tym wiecej musze napisac petli. Jest jakis inny sposob zeby obsluzyc wszystkie zagniezdzone obiekty w obiektach bardziej abstrakcyjnie bez pisania kolejnych petli? Co jesli np. nie wiem ile jest zagniezdzen w zagniezdzeniach?

2

Rekurencja.

0

A jezeli nie mam juz zbudowanego obiektu tylko dopiero go buduje i powiedzmy ze chce zeby obiekt "a" mial 2 nowe obiekty "b" i "c" a te 2 obiekty mialy kolejne 3 i tak powiedzmy do glebokosci 5?

4

Rekurencja.

0

Kumam, dziala.
Nigdy tego nie lubilem btw:> myslalem ze w es6 sa na to jakies czary z ... czy cus.

Dzieki.

2

Taka struktura nazywa się drzewem (tree), jest to szczególny przypadek grafu (graph). Można to zrobić iteracyjnie, można rekurencyjnie. W sieci są opisane różne algorytmy dotyczące drzew i grafów. Szukaj pod hasłem np. "javascript loop tree" albo coś podobnego.

0

Rekurencję można zamienić na iterację za pomocą stosu, dokładnie stosu LIFO . Na przykład, przeszukiwanie preorder, wersja rekurencyjna, pseudokod:

fun traverse_recursive(obj):
	if obj:
		visit(obj)
		traverse_recursive(obj.left)
		traverse_recursive(obj.right)

Wersja iteracyjna:

fun traverse_iterative(obj):
	push(obj)
	while ! stack_is_empty():
		obj = pop()
		visit(obj)
		if obj.left: push(obj.left)
		if obj.right: push(obj.right)

1 użytkowników online, w tym zalogowanych: 0, gości: 1