Ищете конкретную реализацию как для синхронных, так и для асинхронных рекурсивных функций, которые могут быть использованы в качестве отправной точки для превращения будущих рекурсивных функций в плоскую итерацию.
Ниже приведены два примера рекурсивных функций: Синхронный и Асинхронный.
То, что я ищу, представляет собой реализацию как с использованием стека без рекурсии.
Например, возможно, он будет работать следующим образом:
var output = syncStack(myRecursiveFunctionTurnedIterative, [])
Или, если это невозможно, то просто повторное выполнение двух функций ниже, используя стек, и это должно быть достаточно хорошим началом. Например.
var stack = []
function circularReferences(object, references, stack) {
var output = {}
if (object.__circularid__) return true
Object.defineProperty(object, '__circularid__', { value: id++ })
for (var key in object) {
var value = object[key]
if (value && typeof value == 'object') {
console.log(value)
stack.push(???)
circularReferences()
stack.pop()
if (is) output[key] = '[Circular]'
} else {
output[key] = value
}
}
}
Причина этого вопроса заключается в том, что я много лет пытался научиться этому, но никогда не находил систему, которая (а) легко запоминает, как это делать, и (б) практическая.
Синхронный
var references = {}
var object = {
a: {
b: {
c: {
d: {
e: 10,
f: 11,
g: 12
}
}
}
}
}
object.a.b.c.d.x = object
object.a.b.c.d.y = object.a.b
var id = 1
var x = circularReferences(object, references)
console.log(x)
function circularReferences(object, references) {
var output = {}
if (object.__circularid__) return true
Object.defineProperty(object, '__circularid__', { value: id++ })
for (var key in object) {
var value = object[key]
if (value && typeof value == 'object') {
console.log(value)
var is = circularReferences(value, references)
if (is) output[key] = '[Circular]'
} else {
output[key] = value
}
}
}