如何按国家名称过滤含嵌套countries数组的对象数组
过滤包含指定国家的对象数组
现有对象数组allItems,每个元素对象包含name和countries属性,其中countries是由多个含label(国家名称)和TermGuid属性的对象组成的数组。需要根据字符串参数searchByCountry,筛选出countries数组中存在label值与该参数匹配的对象。
示例输入
var allItems = [{ name: 'Item1', countries: [ {label: 'Argentina', TermGuid: 'abc'}, {label: 'Germany', TermGuid: 'abc'}, {label: 'Bosnia', TermGuid: 'abc'}, {label: 'France', TermGuid: 'abc'}, {label: 'UK', TermGuid: 'abc'} ] }, { name: 'Item2', countries: [ {label: 'Argentina', TermGuid: 'abc'} ] }, { name: 'Item3', countries: [ {label: 'Bosnia', TermGuid: 'abc'} ] }, { name: 'Item4', countries: [ {label: 'All', TermGuid: 'abc'} ] } ] var searchByCountry = 'Bosnia';
预期输出
当searchByCountry为'Bosnia'时,筛选结果如下:
var filteredItems = [{ name: 'Item1', countries: [ {label: 'Argentina', TermGuid: 'abc'}, {label: 'Germany', TermGuid: 'abc'}, {label: 'Bosnia', TermGuid: 'abc'}, {label: 'France', TermGuid: 'abc'}, {label: 'UK', TermGuid: 'abc'} ] }, { name: 'Item3', countries: [ {label: 'Bosnia', TermGuid: 'abc'} ] } ]
解决方案
可以使用数组的filter()方法结合some()方法实现需求:
const filteredItems = allItems.filter(item => item.countries.some(country => country.label === searchByCountry) );
代码说明
filter()遍历allItems数组,仅保留回调函数返回true的元素some()检查当前元素的countries数组中,是否存在至少一个对象的label值与searchByCountry完全匹配,只要有一个匹配就返回true
如果需要忽略大小写进行匹配,可将判断条件修改为:
country.label.toLowerCase() === searchByCountry.toLowerCase()
内容的提问来源于stack exchange,提问作者private7
相关产品推荐
相关产品推荐

