Большая проблема, которую я пытаюсь решить, заключается в следующих данных:
var data = [
{ id: 1 },
{ id: 2 },
{ id: 3 },
{ id: 4, children: [
{ id: 6 },
{ id: 7, children: [
{id: 8 },
{id: 9 }
]}
]},
{ id: 5 }
]
Я хочу сделать функцию findById(data, id)
которая возвращает { id: id }
. Например, findById(data, 8)
должен возвращать { id: 8 }
, а findById(data, 4)
должен возвращать { id: 4, children: [...] }
.
Чтобы реализовать это, я использовал Array.prototype.find
рекурсивно, но столкнулся с трудностями, когда return
Array.prototype.find
объектов. Моя реализация возвращает путь к определенному объекту.
Например, когда я использовал findById(data, 8)
, он возвращает путь к { id: 8 }
:
{ id: 4, children: [ { id: 6 }, { id: 7, children: [ { id: 8}, { id: 9] } ] }
Вместо этого я хотел бы просто вернуться
{ id: 8 }
Реализация (Node.js v4.0.0)
var data = [
{ id: 1 },
{ id: 2 },
{ id: 3 },
{ id: 4, children: [
{ id: 6 },
{ id: 7, children: [
{id: 8 },
{id: 9 }
]}
]},
{ id: 5 }
]
function findById(arr, id) {
return arr.find(a => {
if (a.children && a.children.length > 0) {
return a.id === id ? true : findById(a.children, id)
} else {
return a.id === id
}
})
return a
}
console.log(findById(data, 8)) // Should return { id: 8 }
// Instead it returns the "path" block: (to reach 8, you go 4->7->8)
//
// { id: 4,
// children: [ { id: 6 }, { id: 7, children: [ {id: 8}, {id: 9] } ] }