Javascript 基于嵌套数组对象筛选对象

Javascript 基于嵌套数组对象筛选对象,javascript,Javascript,最近,我接受了一次采访,拒绝了大约10个问题。每个问题有60秒。有一个问题出了问题,但我很好奇为什么会这样 我必须过滤那些给定的SearchValue与listarray objectname属性匹配的对象。搜索值已给定 例如: const SearchValue = 'event'; 它是经过筛选的数组,因为列表[0]。名称属性值和事件文本匹配 const res = [ { id: 2, name: 'Events', list: [

最近,我接受了一次采访,拒绝了大约10个问题。每个问题有
60
秒。有一个问题出了问题,但我很好奇为什么会这样

我必须过滤那些给定的
SearchValue
list
array object
name
属性匹配的对象。
搜索
值已给定

例如:

const SearchValue = 'event';
它是经过筛选的数组,因为
列表[0]。名称
属性值和
事件
文本匹配

const res = [
    {
        id: 2,
        name: 'Events',
        list: [
            {
                id: 1,
                name: 'Event Ticketing System',
                slug: '/'
            },
            {
                id: 2,
                name: 'Events Management Software',
                slug: '/'
            }
        ]
    }
]; 
name
属性包含类似以下内容的值
在线翻译服务
拼写和语法检查
等。如果搜索值与
文本
匹配,则将其保存为过滤对象并
控制台.log
。数据集是这样的

const listing = [
  {
    id: 1,
    name: 'Language',
    list: [
      {
        id: 1,
        name: 'Online Translation Services',
        slug: '/'
      },
      {
        id: 2,
        name: 'Spelling and Grammar Check',
        slug: '/'
      },
      {
        id: 3,
        name: 'TEFL Courses',
        slug: '/'
      },
      {
        id: 4,
        name: 'Language Learning',
        slug: '/'
      }
    ]
  },
  {
    id: 2,
    name: 'Events',
    list: [
      {
        id: 1,
        name: 'Event Ticketing System',
        slug: '/'
      },
      {
        id: 2,
        name: 'Events Management Software',
        slug: '/'
      }
    ]
  }
];
我的实现是这样的

const SearchValue='event';
常量列表=[{
id:1,
名称:'语言',
名单:[{
id:1,
名称:“在线翻译服务”,
鼻涕虫:'/'
},
{
id:2,
名称:'拼写和语法检查',
鼻涕虫:'/'
},
{
id:3,
名称:“TEFL课程”,
鼻涕虫:'/'
},
{
id:4,
名称:“语言学习”,
鼻涕虫:'/'
}
]
},
{
id:2,
名称:'事件',
名单:[{
id:1,
名称:“活动票务系统”,
鼻涕虫:'/'
},
{
id:2,
名称:“事件管理软件”,
鼻涕虫:'/'
}
]
}
];
const res=listing.filter(对象=>{
if(Array.isArray(object.list)&&object.list.length>0){
返回object.list.filter((项)=>{
返回item.name.toLowerCase().indexOf(SearchValue.toLowerCase())!=-1;
});
}
});

log('Result Array',res)使用正则表达式检查并测试

const SearchValue='event';
常量列表=[{
id:1,
名称:'语言',
名单:[{
id:1,
名称:“在线翻译服务”,
鼻涕虫:'/'
},
{
id:2,
名称:'拼写和语法检查',
鼻涕虫:'/'
},
{
id:3,
名称:“TEFL课程”,
鼻涕虫:'/'
},
{
id:4,
名称:“语言学习”,
鼻涕虫:'/'
}
]
},
{
id:2,
名称:'事件',
名单:[{
id:1,
名称:“活动票务系统”,
鼻涕虫:'/'
},
{
id:2,
名称:“事件管理软件”,
鼻涕虫:'/'
}
]
}
];
const res=listing.filter(对象=>{
if(Array.isArray(object.list)&&object.list.length>0){
//使用正则表达式测试检查项目
//并更新object.list
object.list=object.list.filter(item=>newregexp(SearchValue,'i').test(item.name));
//如果列表长度>0,则返回true
如果(object.list.length>0)返回true;
}
});
log('Result Array',res)

let newArray=arr.filter(回调(元素[,索引,[array]])[,thisArg])

回拨 函数是一个谓词,用于测试数组的每个元素。返回true以保留元素,否则返回false

返回值 包含通过测试的元素的新数组。如果没有元素通过测试,将返回一个空数组

const SearchValue='language';
常量列表=[{
id:1,
名称:'语言',
名单:[{
id:1,
名称:“在线翻译服务”,
鼻涕虫:'/'
},
{
id:2,
名称:'拼写和语法检查',
鼻涕虫:'/'
},
{
id:3,
名称:“TEFL课程”,
鼻涕虫:'/'
},
{
id:4,
名称:“语言学习”,
鼻涕虫:'/'
}
]
},
{
id:2,
名称:'事件',
名单:[{
id:1,
名称:“活动票务系统”,
鼻涕虫:'/'
},
{
id:2,
名称:“事件管理软件”,
鼻涕虫:'/'
}
]
}
];
const res=listing.reduce((pre,object)=>{
如果(!Array.isArray(object.list)| | object.list.length item.name.toLowerCase().indexOf(SearchValue.toLowerCase())>-1);
返回object.list.length>0?[…pre,object]:pre;
}, []);
log('Result Array',res)
您可以与一起使用,以验证每个对象的
列表
属性的任何元素是否在其
名称
中包含搜索文本

const list=[{id:1,名称:“语言”,列表:[{id:1,名称:“在线翻译服务”,slug:'/'},{id:2,名称:“拼写和语法检查”,slug:'/'},{id:3,名称:“TEFL课程”,slug:'/'},{id:4,名称:“语言学习”,slug:'/'},{id:2,名称:“事件”,列表:[{id:1,名称:'事件票务系统',slug:'/'},{id:2,名称:'事件管理软件',slug:'/'}]}];
const SearchValue='event';
const res=listing.filter({list})=>
一些({name})=>name.toLowerCase().includes(SearchValue.toLowerCase());

console.log(res);
我想这可能会回答您的问题,没有与
事件匹配的内容
…因此您应该有一个空数组??我更新了我的问题,为什么您的结果返回
{“id”:1,“name”:“Language”,“list”:[]}
在过滤结果中。我已经更新了我的答案,检查下面代码中的注释ES6如何引入我必须知道的数组方法。清洁解决方案只有一个
列表
项具有
搜索值
,选择所有第一和第二级数据?