在JavaScript中搜索嵌套的对象数组并返回完整的父对象作为结果
我已经成功地编写了一个递归函数来循环嵌套对象并找到结果。但如果孩子通过测试,我很难把整个家长都加进去。我有以下代码:在JavaScript中搜索嵌套的对象数组并返回完整的父对象作为结果,javascript,Javascript,我已经成功地编写了一个递归函数来循环嵌套对象并找到结果。但如果孩子通过测试,我很难把整个家长都加进去。我有以下代码: const myObj=[ { 名称:“1”, 页码:[ { 名称:“1.1”, 页码:[] }, { 名称:“1.2”, 页码:[] }, ] }, { 名称:‘2’, 页码:[] }, { 名称:‘3’, 页码:[] } ] 功能搜索页面(搜索查询,obj){ 让searchResults=[]; for(设i=0;iobj.filter(pageContainsName(
const myObj=[
{
名称:“1”,
页码:[
{
名称:“1.1”,
页码:[]
},
{
名称:“1.2”,
页码:[]
},
]
},
{
名称:‘2’,
页码:[]
},
{
名称:‘3’,
页码:[]
}
]
功能搜索页面(搜索查询,obj){
让searchResults=[];
for(设i=0;i console.log(搜索结果)代码>您可以采用递归方法,检查嵌套数组是否具有所需的名称
函数搜索页面(数组、字符串){
const find=({name,pages})=>name.includes(string)| | pages&&pages.some(find);
返回array.filter(find);
}
常数
数据=[{name:'1',页面:[{name:'1.1',页面:[]},{name:'1.2',页面:[]},{name:'2',页面:[]},{name:'3',页面:[]},
搜索结果=搜索页面(数据“1.1”);
console.log(搜索结果)代码>
.as控制台包装{max height:100%!important;top:0;}
这里有一种可能的方法,对top数组使用.filter
,然后递归调用。有些
:
const myObj=[
{
名称:“1”,
页码:[
{
名称:“1.1”,
页码:[]
},
{
名称:“1.2”,
页码:[]
},
]
},
{
名称:‘2’,
页码:[]
},
{
名称:‘3’,
页码:[]
}
];
const searchPages=(nameToFind,obj)=>obj.filter(pageContainsName(nameToFind));
const pageContainsName=nameToFind=>({name,pages})=>(
name===nameToFind | | pages.some(pageContainsName(nameToFind))
);
让searchResults=searchPages('1.1',myObj);
console.log(搜索结果)
如果要返回父对象而不是搜索的对象,只需更改searchString()
实现,使其将父对象作为第三个参数,然后在找到所需的字符串时返回它:
function searchPages(searchQuery, obj) {
let searchResults = [];
for (let i = 0; i < obj.length; i++) {
let item = searchString(obj[i], searchQuery, obj);
if (item) {
searchResults.push(item);
}
}
return searchResults;
}
function searchString(obj, string, parent) {
if (obj.name.includes(string)) {
return parent;
}
for (let i = 0; i < obj.pages.length; i++) {
const possibleResult = searchString(obj.pages[i], string, obj);
if (possibleResult) {
return possibleResult;
}
}
}
功能搜索页面(searchQuery,obj){
让searchResults=[];
for(设i=0;i
这样,您将始终考虑家长
演示:
const myObj=[
{
名称:“1”,
页码:[
{
名称:“1.1”,
页码:[
{
名称:“1.1.1”,
页码:[]
}
]
},
{
名称:“1.2”,
页码:[]
},
]
},
{
名称:‘2’,
页码:[]
},
{
名称:‘3’,
页码:[]
}
]
功能搜索页面(搜索查询,obj){
让searchResults=[];
for(设i=0;i console.log(搜索结果)代码>以下是我使用.filter
-ingmyObj
和.find
-ing具有给定名称的嵌套页面的方法
const myObj=[
{
名称:“1”,
页码:[
{
名称:“1.1”,
页码:[]
},
{
名称:“1.2”,
页码:[]
},
]
},
{
名称:‘2’,
页码:[]
},
{
名称:‘3’,
页码:[]
}
];
const searchPages=(名称,arr)=>arr.filter(
({pages})=>pages.find(page=>page.name===name)
)
让searchResults=searchPages('1.1',myObj);
console.log(搜索结果)代码>谢谢你的回答!但这不适用于嵌套超过2个的数组levels@cup_of你能用一个例子重现它吗?是的,我编辑了你的答案,它只会立即返回它parent@cup_of因为这是父对象,所以您说需要返回父对象而不是当前对象。谢谢您的回答!似乎对我有用,但有没有办法修改它,使其包含部分字符串?就像我在函数中所做的那样obj.name.includes(string)
您可以用includes
替换检查。请参见编辑。