JS中处理_.get返回的字符串/数组的搜索逻辑优化及方案评估
问题分析与解决方案
_.get(params, "_q") 的返回值可能是字符串或字符串数组。输入“hello, there”时,它会转为字符串数组,导致原代码出现 h.get(...).trim is not a function 报错。
注:_ 来自lodash库。
输入示例
- 输入“hello, there”时
console.log(params)结果:
{ "_q": [ "hello", " there " ] }
- 输入“hello”时
console.log(params)结果:
{ "_q": "hello" }
- 输入“hello there”时
console.log(params)结果:
{ "_q": "hello there" }
当前代码
let where = {}; if (_.get(params, "_q")) { where._q = _.get(params, "_q").trim(); }
尝试的修复方案
const _q = _.get(params, "_q"); if (_q) { where._q = [] .concat(_q) .map((str) => str.split(",").map((str) => str.trim())) .flat(); }
修复方案可行性分析
你尝试的方案是可行的:
[].concat(_q)能统一处理字符串和数组输入——如果是字符串,会转为单元素数组;如果是数组,保持原样。- 对每个元素按逗号分割后再trim,最后通过
flat()把嵌套数组拍平,最终得到所有经过trim的关键字数组。
不过这个方案可以进一步简化,提升代码简洁度。
现代JS优化方案
方案1:用flatMap简化层级
const _q = _.get(params, "_q"); if (_q) { where._q = [].concat(_q) .flatMap(str => str.split(",").map(s => s.trim())); }
flatMap会先执行map逻辑,再自动拍平一层数组,比单独调用map+flat()更高效简洁。
方案2:结合lodashcastArray增强语义
lodash的_.castArray方法可以直接将非数组值转为数组,比[].concat()语义更清晰:
const _q = _.get(params, "_q"); if (_q) { where._q = _.castArray(_q) .flatMap(str => str.split(",").map(s => s.trim())); }
方案3:过滤空字符串(可选)
如果需要处理类似“hello,,world”这类输入,过滤分割后产生的空字符串,可以添加过滤逻辑:
const _q = _.get(params, "_q"); if (_q) { where._q = _.castArray(_q) .flatMap(str => str.split(",") .map(s => s.trim()) .filter(Boolean)); // 过滤空字符串 }
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

