周五临下班了,客户群里突然抛出一个问题,产品筛选功能,选择某个产品的时候,无法匹配出选择的产品,写代码的人已经离职,只能我来处理了,大致看了下代码,也没感觉出有什么明显的问题,毕竟这个功能都用了几个月了,从没发现什么问题;但是仔细看看,就感觉这个split("-") 似乎有些不妥。万一名称中也有-怎么办;刚好出问题的就是产品名称中带有 "-"。
问题代码
let fundList = [{
fund_name: "测试产品",
fund_id: 1,
}, {
fund_name: "测试-产品",
fund_id: 2,
}, ];
function queryName(value) {
let queryNameList = value.join("-").split("-");
let ary = [];
fundList.forEach((item) => {
if (
queryNameList.indexOf(item.fund_name) > -1 ||
queryNameList.indexOf(item.fund_id) > -1
) {
ary.push(item);
}
});
return ary;
}
let fund_list = queryName(["2-测试-产品", '1-测试产品'])
console.log("fund_list===>", fund_list);
代码描述
- 将传入的数组value(数组,每一项由一个“fund_id-fund_name”组成,fund_id只能是数字)先用"-"拼接成一个由 - 连接的字符串,然后再分割成数组,这样就形成了一个包含fund_id和fund_name的数组queryNameList
- 再将产品数组中的每一项,使用indexOf去queryNameList中查找
主要两个问题
-
使用 “-” 分割产品名称,如果名称中也有 "-"
-
使用 indexOf 匹配产品id的时候没有考虑到后台返回产品id是数字
["2-测试-产品"].join("-").split("-") => ['2', '测试', '产品'] // 如果名称中也有 "-" 导致产品名称被分为两部分,再根据产品名称就无法匹配了 ['2', '测试', '产品'].indexOf('测试-产品') = -1 // 代码中使用产品名称 || 产品id双保险,但是有没有考虑到产品id是数字, ['2', '测试', '产品'].indexOf(2) // 修改,删除根据名称匹配,只根据产品id匹配,并且将id处理成字符串 if (queryNameList.indexOf(item.fund_id+'') > -1) { ary.push(item); }