如何用JavaScript/jQuery移除strReviewers中指定ID的用户记录
简化JavaScript处理用户记录字符串的实现方案
需求背景
需处理格式特殊的用户记录字符串strReviewers:
- 整条记录以
;分隔 - 单条记录内的字段以
*,*分隔,第一个字段为userid - 传入ID数组,移除所有
userid匹配的记录,重新拼接成原格式的字符串
原实现与示例数据
示例字符串:
var strReviewers = "88664734*,*Andrew Farmer*,*19042*,**,*,19013,19017,19042,19043,19051,*;*88639280*,*Sally Hopewell*,*19042*,**,*,19013,19017,19042,19043,*;*88686221*,*Jonathan Rees*,*19042*,**,*,19013,19017,19042,19043,19060,*;*88676217*,*James Wason*,*19042*,**,*,19013,19017,19042,19043,*;*";
原实现代码:
var strReviewers = "88664734*,*Andrew Farmer*,*19042*,**,*,19013,19017,19042,19043,19051,*;*88639280*,*Sally Hopewell*,*19042*,**,*,19013,19017,19042,19043,*;*88686221*,*Jonathan Rees*,*19042*,**,*,19013,19017,19042,19043,19060,*;*88676217*,*James Wason*,*19042*,**,*,19013,19017,19042,19043,*;*"; function removeReviewerByID(ids = []) { return strReviewers .split(";").map(item => item.split("*,*")) .filter(item => item[0] !== "*") .map(item => ({ userid:item[0], name:item[1], roleid:item[2], txtSpeciality:item[3], rolelist:item[4] })) .filter(item => (!ids.includes(item["userid"]) && !ids.includes(item["userid"].replace(/\*/g, '')))) .map(item => ({ record: item["userid"].concat("*,*").concat(item["name"]).concat("*,*").concat(item["roleid"]).concat("*,*").concat(item["txtSpeciality"]).concat("*,*").concat(item["rolelist"]).concat(";"))) .reduce((accumulator, item) => { return accumulator.concat(item["record"]); }, "") } console.log(removeReviewerByID(["88664734","88639280","88676217"]));
简化后的实现方案
可以从效率、冗余代码、可读性三个维度简化:
var strReviewers = "88664734*,*Andrew Farmer*,*19042*,**,*,19013,19017,19042,19043,19051,*;*88639280*,*Sally Hopewell*,*19042*,**,*,19013,19017,19042,19043,*;*88686221*,*Jonathan Rees*,*19042*,**,*,19013,19017,19042,19043,19060,*;*88676217*,*James Wason*,*19042*,**,*,19013,19017,19042,19043,*;*"; function removeReviewerByID(ids = []) { const idSet = new Set(ids); return strReviewers.split(';') // 过滤空记录和无效记录 .filter(record => record.trim() && !record.startsWith('*')) // 过滤需要移除的ID记录 .filter(record => { const userId = record.split('*,*')[0].replace(/\*/g, ''); return !idSet.has(userId); }) // 拼接回原格式 .map(record => `${record};`) .join(''); } console.log(removeReviewerByID(["88664734","88639280","88676217"]));
简化细节说明
- 效率优化:把ID数组转为
Set,将includes的O(n)查找成本降为O(1),数据量越大优势越明显 - 减少冗余转换:跳过将记录转为对象再还原的步骤,直接操作原始字符串片段,减少内存占用和代码层级
- 可读性提升:用模板字符串和
join替代多次concat和reduce,拼接逻辑更直观 - 边界处理增强:保留原代码的无效记录过滤逻辑,新增
trim()处理空字符串,避免末尾出现多余分号
内容的提问来源于stack exchange,提问作者Karim Ali
相关产品推荐
相关产品推荐

