记录一次生产问题

159 阅读2分钟

周五临下班了,客户群里突然抛出一个问题,产品筛选功能,选择某个产品的时候,无法匹配出选择的产品,写代码的人已经离职,只能我来处理了,大致看了下代码,也没感觉出有什么明显的问题,毕竟这个功能都用了几个月了,从没发现什么问题;但是仔细看看,就感觉这个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); 

代码描述

  1. 将传入的数组value(数组,每一项由一个“fund_id-fund_name”组成,fund_id只能是数字)先用"-"拼接成一个由 - 连接的字符串,然后再分割成数组,这样就形成了一个包含fund_id和fund_name的数组queryNameList
  2. 再将产品数组中的每一项,使用indexOf去queryNameList中查找

主要两个问题

  1. 使用 “-” 分割产品名称,如果名称中也有 "-"

  2. 使用 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);
    }
    

总结

💡 其实功能很简单,开发考虑复杂了,本可以就用fund_id进行匹配的,却要多加一个产品名称进行匹配,自测的时候也没有单独测试两个匹配是否都正常。开发者稍微细心些便能避免这个问题。