Большая проблема, которую я пытаюсь решить, заключается в следующих данных:
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] } ] }