Javascript 基于嵌套数组对象筛选对象
最近,我接受了一次采访,拒绝了大约10个问题。每个问题有Javascript 基于嵌套数组对象筛选对象,javascript,Javascript,最近,我接受了一次采访,拒绝了大约10个问题。每个问题有60秒。有一个问题出了问题,但我很好奇为什么会这样 我必须过滤那些给定的SearchValue与listarray objectname属性匹配的对象。搜索值已给定 例如: const SearchValue = 'event'; 它是经过筛选的数组,因为列表[0]。名称属性值和事件文本匹配 const res = [ { id: 2, name: 'Events', list: [
60
秒。有一个问题出了问题,但我很好奇为什么会这样
我必须过滤那些给定的SearchValue
与list
array objectname
属性匹配的对象。搜索
值已给定
例如:
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如何引入我必须知道的数组方法。清洁解决方案只有一个列表
项具有搜索值
,选择所有第一和第二级数据?