Мне не удается преобразовать рекурсивную функцию в итерацию.Рассмотрим следующую функцию :
function getTreeDataFromRows (id, rows) {
let ret_val = []
for (let i = 0; i < rows.length; i++) {
let row = rows[i]
if (id == row.id_parent) {
let new_element = {
id: row.id,
id_parent: row.id_parent,
value: row.value,
data: getTreeDataFromRows(row.id, rows)
}
for (let property in row) {
if ('id' == property || 'id_parent' == property || 'value' == property) {
continue
}
new_element[property] = row[property]
}
ret_val.push(new_element)
}
}
return ret_val
}
У меня есть вход json, похожий на этот:
[{
"id": "c-1",
"id_parent": null,
"value": "Chapter 1"
},
{
"id": "a-1",
"id_parent": "c-1",
"value": "Article 1.1"
},
{
"id": "a-2",
"id_parent": "c-1",
"value": "Article 1.2"
},
{
"id": "c-2",
"id_parent": null,
"value": "Chapter 2"
},
{
"id": "a-21",
"id_parent": "c-2",
"value": "Article 2.1"
},
{
"id": "a-22",
"id_parent": "c-2",
"value": "Article 2.2"
},
{
"id": "a-221",
"id_parent": "a-22",
"value": "Quote 221 from article 2.2"
},
{
"id": "a-222",
"id_parent": "a-22",
"value": "Quote 222 from article 2.2"
}
]
вывод должен быть таким:
[{
"id": "c-1",
"id_parent": null,
"value": "Chapter 1",
"data": [{
"id": "a-1",
"id_parent": "c-1",
"value": "Articole 1.1",
"data": []
},
{
"id": "a-2",
"id_parent": "c-1",
"value": "Articole 1.2",
"data": []
}
]
},
{
"id": "c-2",
"id_parent": null,
"value": "Chapter 2",
"data": [{
"id": "a-21",
"id_parent": "c-2",
"value": "Articole 2.1",
"data": []
},
{
"id": "a-22",
"id_parent": "c-2",
"value": "Articole 2.2",
"data": [{
"id": "a-221",
"id_parent": "a-22",
"value": "Quote 221 from article 2.2",
"data": []
},
{
"id": "a-222",
"id_parent": "a-22",
"value": "Quote 222 from article 2.2",
"data": []
},
]
},
]
}
]
Этот вывод необходим для древовидной таблицы.Рекурсивная функция выдает ошибку «Превышен максимальный размер стека вызовов» при обработке большого количества данных.Также на дереве может быть большое количество детей (сын, внук и т. Д.).Я пытался написать цикл для, используя массив стека, но мне это не удалось.Я немного сбит с толку, и мой код также может сбивать с толку.
function functionWithIteration (rows) {
var my_stack = [null]
var final_val = []
while( my_stack.length > 0 ) {
var ret_val = []
var first_time = true
var id = my_stack.pop()
var temp_val = []
for (let i = 0; i < rows.length; i++) {
var row = rows[i]
var signal = true
if (id == row.id_parent) {
signal = false
var new_element = {
id: row.id,
id_parent: row.id_parent,
value: row.value,
data: []
}
for (let property in row) {
if (property == 'id' || property == 'id_parent' || property == 'value') {
continue
}
new_element[property] = row[property]
}
if (first_time){
ret_val.push(new_element)
first_time = false
}
else {
ret_val[ret_val.length - 1].data.push(new_element)
}
}
if ( signal) {
temp_val.push(ret_val)
my_stack.push(row.id)
}
}
final_val.push(temp_val)
}
return final_val
}
Любая помощь будет высоко оценена!Спасибо!