我正在撰寫一個遞回函式來找出與我傳遞給函式具有相同 id 的專案。
如您所見,每個物件項都有一個id屬性,并且該項也有一個sub_categories屬性,該屬性是一個包含其他物件的陣列或一個空陣列。
const arr = [
{
"id": 1013,
"code": "CAT1",
"name": {
"en": "TOP 1",
"fr": "TOP 1"
},
"_name": "TOP 1",
"level": 1,
"sub_categories": [
{
"id": 1016,
"code": "SUB1",
"name": {
"en": "Child 1",
"fr": "Child 1"
},
"_name": "Child 1",
"level": 2,
"sub_categories": [
{
"id": 1017,
"code": "SUB11",
"name": {
"en": "Child 2",
"fr": "Child 2"
},
"_name": "Child 2",
"level": 3,
"sub_categories": [
{
"id": 1018,
"code": "SUB111",
"name": {
"en": "Child 3",
"fr": "Child 3"
},
"_name": "Child 3",
"level": 4,
"sub_categories": [
{
"id": 1019,
"code": "SUB21",
"name": {
"en": "Child 4",
"fr": "Child 4"
},
"_name": "Child 4",
"level": 5,
"sub_categories": []
}
]
}
]
}
]
}
]
},
{
"id": 1014,
"code": "CAT2",
"name": {
"en": "TOP 2",
"fr": "TOP 2"
},
"_name": "TOP 2",
"level": 1,
"sub_categories": [
{
"id": 1020,
"code": "SUB22",
"name": {
"en": "Child 1",
"fr": "Child 1"
},
"_name": "Child 1",
"level": 2,
"sub_categories": []
}
]
},
{
"id": 1015,
"code": "CAT3",
"name": {
"en": "TOP 3",
"fr": "TOP 3"
},
"_name": "TOP 3",
"level": 1,
"sub_categories": []
}
]
const arrFilter = (targetId) => {
let res = null;
for(let y = 0; y < arr.length; y ) {
if (arr[y].id === targetId) {
res = arr[y];
} else if(arr[y].sub_categories.length) {
res = arrFilter(arr[y].sub_categories, targetId)
}
if(res !== null) return res;
}
}
console.log(arrFilter(1017))
當我傳遞 id1017時,它會拋出一個錯誤Maximum call stack size exceeded,它似乎無限回圈。任何人都知道為什么我的代碼無限回圈?
uj5u.com熱心網友回復:
您arr在函式中使用來搜索專案,但是,如果您第二次呼叫該函式,您仍在使用arr.
您需要將陣列本身傳遞給函式,以便您在第二次(遞回)時只搜索該部分:
const arr = [{"id": 1013, "code": "CAT1", "name": {"en": "TOP 1", "fr": "TOP 1"}, "_name": "TOP 1", "level": 1, "sub_categories": [{"id": 1016, "code": "SUB1", "name": {"en": "Child 1", "fr": "Child 1"}, "_name": "Child 1", "level": 2, "sub_categories": [{"id": 1017, "code": "SUB11", "name": {"en": "Child 2", "fr": "Child 2"}, "_name": "Child 2", "level": 3, "sub_categories": [{"id": 1018, "code": "SUB111", "name": {"en": "Child 3", "fr": "Child 3"}, "_name": "Child 3", "level": 4, "sub_categories": [{"id": 1019, "code": "SUB21", "name": {"en": "Child 4", "fr": "Child 4"}, "_name": "Child 4", "level": 5, "sub_categories": [] } ] } ] } ] } ] }, {"id": 1014, "code": "CAT2", "name": {"en": "TOP 2", "fr": "TOP 2"}, "_name": "TOP 2", "level": 1, "sub_categories": [{"id": 1020, "code": "SUB22", "name": {"en": "Child 1", "fr": "Child 1"}, "_name": "Child 1", "level": 2, "sub_categories": [] } ] }, {"id": 1015, "code": "CAT3", "name": {"en": "TOP 3", "fr": "TOP 3"}, "_name": "TOP 3", "level": 1, "sub_categories": [] } ];
const arrFilter = (search, targetId) => {
let res = null;
for (let y = 0; y < search.length; y ) {
if (search[y].id === targetId) {
res = search[y];
} else if(search[y].sub_categories.length) {
res = arrFilter(search[y].sub_categories, targetId)
}
if(res !== null) return res;
}
}
console.log(arrFilter(arr, 1017))
稍微改進的版本可能看起來像:
顯示代碼片段
const arr = [{"id": 1013, "code": "CAT1", "name": {"en": "TOP 1", "fr": "TOP 1"}, "_name": "TOP 1", "level": 1, "sub_categories": [{"id": 1016, "code": "SUB1", "name": {"en": "Child 1", "fr": "Child 1"}, "_name": "Child 1", "level": 2, "sub_categories": [{"id": 1017, "code": "SUB11", "name": {"en": "Child 2", "fr": "Child 2"}, "_name": "Child 2", "level": 3, "sub_categories": [{"id": 1018, "code": "SUB111", "name": {"en": "Child 3", "fr": "Child 3"}, "_name": "Child 3", "level": 4, "sub_categories": [{"id": 1019, "code": "SUB21", "name": {"en": "Child 4", "fr": "Child 4"}, "_name": "Child 4", "level": 5, "sub_categories": [] } ] } ] } ] } ] }, {"id": 1014, "code": "CAT2", "name": {"en": "TOP 2", "fr": "TOP 2"}, "_name": "TOP 2", "level": 1, "sub_categories": [{"id": 1020, "code": "SUB22", "name": {"en": "Child 1", "fr": "Child 1"}, "_name": "Child 1", "level": 2, "sub_categories": [] } ] }, {"id": 1015, "code": "CAT3", "name": {"en": "TOP 3", "fr": "TOP 3"}, "_name": "TOP 3", "level": 1, "sub_categories": [] } ];
const arrFilter = (search, targetId) => {
for (const obj of search) {
if (obj.id === targetId) {
return obj;
}
if (obj.sub_categories.length > 0) {
const tmp = arrFilter(obj.sub_categories, targetId);
if (tmp) {
return tmp;
}
}
}
return false;
}
console.log(arrFilter(arr, 1014))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/515676.html
標籤:javascript递归
