Ser*_*pia 1 javascript object find lodash
给定这个结构,我如何在这个深层嵌套的对象结构中找到具有给定id的对象.
const menuItems = [
{
id: 1,
imageUrl: "http://placehold.it/65x65",
display: "Shop Women",
link: "#",
type: "image",
nextItems: [
{
id: 10,
display: "?",
link: "#",
type: "menuitem"
},
{
id: 20,
display: "??",
link: "#",
type: "menuitem-withmore",
nextItems: [
{
id: 100,
display: "I'm inside one nest",
link: "#",
type: "menuitem"
}
]
},
{
id: 30,
display: "??",
link: "#",
type: "menuitem-withmore",
nextItems: []
},
{
id: 40,
display: "??",
link: "#",
type: "menuitem-withmore",
nextItems: []
},
{
id: 50,
display: "????",
link: "#",
type: "menuitem-withmore",
nextItems: []
},
{
id: 60,
display: "SALE",
link: "#",
type: "menuitem-withmore",
style: "bold",
nextItems: []
},
{
id: 70,
display: "???",
link: "#",
type: "menuitem-withmore",
nextItems: []
},
{
type: "separator"
},
{
id: 80,
display: "?????",
link: "#",
type: "menuitem"
},
{
id: 90,
display: "????",
link: "#",
type: "menuitem"
},
{
id: 99,
display: "? ????",
link: "#",
type: "menuitem"
}
]
},
{
id: 2,
imageUrl: "http://placehold.it/65x65",
display: "Shop Men",
link: "#",
type: "image",
nextItems: [
{
id: 95,
display: "MEN's ITEMS.",
link: "#",
type: "menuitem"
}
]
}
];
Run Code Online (Sandbox Code Playgroud)
假设我想找到对象id: 20
并返回:
{
id: 20,
display: "??",
link: "#",
type: "menuitem-withmore",
nextItems: [
{
id: 100,
display: "I'm inside one nest",
link: "#",
type: "menuitem"
}
]
},
Run Code Online (Sandbox Code Playgroud)
我似乎无法找到如何使用lodash,并且这个包可能已经解决了我的问题,但我无法理解如何使它适用于我的用例.
使用DFS.
const menuItems = [
{
id: 1,
imageUrl: "http://placehold.it/65x65",
display: "Shop Women",
link: "#",
type: "image",
nextItems: [
{
id: 10,
display: "?",
link: "#",
type: "menuitem"
},
{
id: 20,
display: "??",
link: "#",
type: "menuitem-withmore",
nextItems: [
{
id: 100,
display: "I'm inside one nest",
link: "#",
type: "menuitem"
}
]
},
{
id: 30,
display: "??",
link: "#",
type: "menuitem-withmore",
nextItems: []
},
{
id: 40,
display: "??",
link: "#",
type: "menuitem-withmore",
nextItems: []
},
{
id: 50,
display: "????",
link: "#",
type: "menuitem-withmore",
nextItems: []
},
{
id: 60,
display: "SALE",
link: "#",
type: "menuitem-withmore",
style: "bold",
nextItems: []
},
{
id: 70,
display: "???",
link: "#",
type: "menuitem-withmore",
nextItems: []
},
{
type: "separator"
},
{
id: 80,
display: "?????",
link: "#",
type: "menuitem"
},
{
id: 90,
display: "????",
link: "#",
type: "menuitem"
},
{
id: 99,
display: "? ????",
link: "#",
type: "menuitem"
}
]
},
{
id: 2,
imageUrl: "http://placehold.it/65x65",
display: "Shop Men",
link: "#",
type: "image",
nextItems: [
{
id: 95,
display: "MEN's ITEMS.",
link: "#",
type: "menuitem"
}
]
}
];
function dfs(obj, targetId) {
if (obj.id === targetId) {
return obj
}
if (obj.nextItems) {
for (let item of obj.nextItems) {
let check = dfs(item, targetId)
if (check) {
return check
}
}
}
return null
}
let result = null
for (let obj of menuItems) {
result = dfs(obj, 100)
if (result) {
break
}
}
console.dir(result)
Run Code Online (Sandbox Code Playgroud)