Поскольку ваши входные данные являются рекурсивной структурой, программа с рекурсивной структурой будет наилучшим совпадением. В этом случае у вас есть -
- a список из узлов (
TREE_DATA.items
) - , где каждый узел ( объект ) может содержать
children
свойство , которое также является списком из узлов
Это рекурсивное отношение дает нам уникальную возможность узнать об особом виде рекурсии, когда одна функция, A , вызывает функцию B , которая, в свою очередь, вызывает функцию A , который вызывает B и так далее ... это называется взаимная рекурсия .
Мы начинаем с функции, которая занимает всего one входных узлов, метко названных find1
. Он принимает один узел, деструктурированный до children
и o
, и идентификатор для поиска, id
-
const find1 = ({ children = [], ...o }, id = 0) =>
o.id == id // if the object's id matches the input id,
? o // match found! return the object
: findAll(children, id) // otherwise findAll of the children with the id
Далее очевидно, что нам нужно реализовать findAll
. Он принимает список узлов, деструктурированных до first
и more
, и идентификатор для поиска, id
-
const findAll = ([ first, ...more ], id = 0) =>
first === undefined // if the list is empty,
? undefined // there's nothing to search! return no match
: find1(first, id) // find1 the first item in the list using the id
|| findAll(more, id) // OR findAll on more using the same id
Вот и все! Функции почти пишут сами, без необходимости в посторонних переменных или шагах. Он ведет себя точно так, как мы ожидаем -
console.log(findAll(TREE_DATA.items, 1))
// { id: "1", name: "johnny" }
console.log(findAll(TREE_DATA.items, 11))
// { id: "11" }
console.log(findAll(TREE_DATA.items, 99))
// undefined (no match found)
Проверьте результаты в своем браузере, запустив фрагмент ниже -
const find1 = ({ children = [], ...o }, id = 0) =>
o.id == id
? o
: findAll(children, id)
const findAll = ([ first, ...more ], id = 0) =>
first === undefined
? undefined
: find1(first, id) || findAll(more, id)
const TREE_DATA =
{items:[{id:"1",name:"johnny"},{id:"2",name:"ingi",children:[{id:"3",name:"johnson"},{id:"4",name:"katy"},{id:"5",name:"steve",children:[{id:"6",name:"lisa"},{id:"7",name:"penny",children:[{id:"8",name:"john"},{id:"9",name:"hoyong"}]},{id:"10"}]},{id:"11"},{id:"12"}]},{id:"13"},{id:"14"}]}
console.log(findAll(TREE_DATA.items, 1))
// { id: "1", name: "johnny" }
console.log(findAll(TREE_DATA.items, 11))
// { id: "11" }
console.log(findAll(TREE_DATA.items, 99))
// undefined (no match found)