原生JavaScript实现对象数组多属性联合搜索返回无重复结果问询
多属性多关键词搜索过滤实现方案
现有代码核心问题
- 未拆分多关键词:将整段输入作为单个匹配串,不支持空格分隔的多关键词同时匹配逻辑
- 重复数据问题:同一个对象多个属性命中匹配规则时会被多次推入结果数组
- 结果累加问题:全局定义的results变量不会在每次搜索前清空,多次调用搜索函数结果会叠加
调整后实现代码
const objects = [ {laneId:"12345", lane:"HKG-SAV", equipmentType:"20'STD", sumOfContainers: "8", baseline:"$1234", new:"$1234", newSaving:"$1234"}, {laneId:"12346", lane:"HKG-FRA", equipmentType:"20'STD", sumOfContainers: "8", baseline:"$1234", new:"$1234", newSaving:"$1234"}, {laneId:"12347", lane:"HKG-LAX", equipmentType:"20'STD", sumOfContainers: "9", baseline:"$1234", new:"$1234", newSaving:"$1234"}, ]; const Search = (toSearch) => { // 拆分多关键词,过滤连续空格产生的空值 const keywords = toSearch.trim().split(/\s+/).filter(k => k); // 无有效关键词时返回空数组,可根据需求调整为返回全部对象 if (keywords.length === 0) return []; // 过滤满足所有关键词匹配规则的对象 return objects.filter(item => { // 要求所有关键词都能在当前对象的任意属性中找到 return keywords.every(keyword => { // 遍历对象所有属性值匹配关键词,统一转字符串避免类型差异导致匹配失败 return Object.values(item).some(value => { return String(value).includes(keyword); }); }); }); }
效果验证
- 调用
Search('HKG'):返回全部3个对象 - 调用
Search('HKG 12345'):仅返回第一个laneId为12345的对象 - 调用
Search('8'):返回sumOfContainers为8的前2个对象 - 调用
Search('8 SAV'):仅返回同时匹配8和SAV的第一个对象
内容的提问来源于stack exchange,提问作者Corona
相关产品推荐
相关产品推荐

