如何从对象数组中搜索字符串并按指定规则排序?
数组筛选与按关键词优先级排序解决方案
原始数据
const data = [ {id:1, sItem:"This is javascript", status:"trending"}, {id:2, sItem:"javascript is fun", status:"trending"}, {id:3, sItem:"learning javascript", status:"trending"}, {id:4, sItem:"how to code in javascript", status:"trending"}, {id:5, sItem:"javascript will rule", status:"trending"}, {id:6, sItem:"javascript can do anything", status:"trending"} ];
需求说明
筛选出sItem属性包含关键词javascript的元素,并按以下规则排序:
- 以
javascript开头的元素排在最前面 - 其余包含该关键词的元素紧随其后,保持原始数组中的相对顺序
现有代码问题
你当前的filter逻辑会检查对象的所有属性(比如status)是否包含关键词,但需求只针对sItem属性,需要调整筛选条件;另外还缺少排序步骤。
解决方案
方法1:分组拼接(推荐,保证原顺序)
先筛选符合条件的元素,再分成"以关键词开头"和"仅包含关键词"两组,最后拼接数组,确保同组元素保持原始顺序:
const search = "javascript"; // 筛选sItem包含关键词的元素 const filteredItems = data.filter(obj => obj.sItem.includes(search)); // 拆分两组 const startsWithKeyword = filteredItems.filter(obj => obj.sItem.startsWith(search)); const containsKeyword = filteredItems.filter(obj => !obj.sItem.startsWith(search)); // 合并得到结果 const result = startsWithKeyword.concat(containsKeyword);
方法2:使用sort排序
通过sort方法调整顺序,注意:部分JavaScript引擎的sort是不稳定排序,可能会打乱同组元素的原始顺序:
const search = "javascript"; const result = data .filter(obj => obj.sItem.includes(search)) .sort((a, b) => { const aStarts = a.sItem.startsWith(search); const bStarts = b.sItem.startsWith(search); // 开头元素优先级更高 if (aStarts && !bStarts) return -1; if (!aStarts && bStarts) return 1; // 同组尝试保持原顺序(不稳定排序可能失效) return 0; });
验证结果
两种方法最终都会得到预期输出:
const result = [ {id:2, sItem:"javascript is fun", status:"trending"}, {id:5, sItem:"javascript will rule", status:"trending"}, {id:6, sItem:"javascript can do anything", status:"trending"}, {id:1, sItem:"This is javascript", status:"trending"}, {id:3, sItem:"learning javascript", status:"trending"}, {id:4, sItem:"how to code in javascript", status:"trending"} ];
内容的提问来源于stack exchange,提问作者Rock Havmor
相关产品推荐
相关产品推荐

