如何根据多字段组合值从JavaScript数组中查询数据?
实现国家数据多字段组合搜索函数
现有国家信息数组如下:
const countryData = [ { id: 1, name: 'Afghanistan', isoAlpha2: 'AF', isoAlpha3: 'AFG', isoNumeric: 4, currency: { code: 'AFN', name: 'Afghani', symbol: '؋' }, callingCodes: ['+93'], languages: ['pus'], emoji: '🇦🇫' }, { id: 2, name: 'Albania', isoAlpha2: 'AL', isoAlpha3: 'ALB', isoNumeric: 8, currency: { code: 'ALL', name: 'Lek', symbol: 'L' }, callingCodes: ['+355'], languages: ['sqi'], emoji: '🇦🇱' } ]
需求说明
需要实现一个search函数,支持以name、isoAlpha2、isoAlpha3字段的任意组合作为查询条件(比如search({name: "Afghanistan"})、search({name: "Afghanistan", isoAlpha2: "AF"})这类调用方式),从数组里筛选出匹配的数据。
实现方案
可以用数组的filter方法搭配对象属性遍历,轻松实现多条件组合匹配:
function search(query) { // 把查询对象转成键值对数组,方便遍历每个条件 const queryEntries = Object.entries(query); // 过滤出满足所有查询条件的国家 return countryData.filter(country => { return queryEntries.every(([key, value]) => { // 只处理指定的三个字段,其他字段直接跳过 if (!['name', 'isoAlpha2', 'isoAlpha3'].includes(key)) return true; // 严格匹配字段值,如需模糊匹配可修改此处逻辑 return country[key] === value; }); }); }
代码说明
- 先把查询对象拆解成键值对数组
queryEntries,方便逐个检查每个条件; - 用
filter遍历国家数组,筛选出符合所有条件的项; every方法确保所有查询条件都得满足(相当于逻辑“且”,只要有一个条件不满足就会被排除);- 加了字段白名单限制,只处理
name、isoAlpha2、isoAlpha3这三个字段,其他无关条件直接忽略; - 这里默认用严格相等匹配,如果要支持模糊匹配(比如忽略大小写、搜索包含关键词的内容),可以把匹配逻辑改成:
return country[key].toLowerCase().includes(value.toLowerCase())
使用示例
// 单条件查询,返回阿富汗的对象 console.log(search({name: "Afghanistan"})); // 多条件组合查询,返回阿富汗的对象 console.log(search({name: "Afghanistan", isoAlpha2: "AF"})); // 无匹配条件,返回空数组 console.log(search({isoAlpha3: "XYZ"}));
内容的提问来源于stack exchange,提问作者Md Ali
相关产品推荐
相关产品推荐

