在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;iconsole.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;iconsole.log(搜索结果)以下是我使用
.filter
-ing
myObj
.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
替换检查。请参见编辑。