如何使用Lodash对集合元素进行映射并查找首个符合条件的元素?
更简洁的Lodash写法来实现“转换+找首个符合条件元素”
嘿,这个需求其实不用绕着_.chain+map+find走,有更简洁高效的写法,分两种场景来说:
场景1:筛选条件基于原元素
如果你的判断逻辑是针对原数组元素的(比如你要找原元素等于2的,再转换成*2*),那直接先找原元素,再做转换就行——比先map整个数组再find高效多了,因为只需要遍历到目标元素就停止,而且写法更短:
// 先找到原元素,再转换 const target = _.find([1,2,3], i => i === 2); const result = target ? `*${target}*` : undefined; // 或者一行搞定 const result = _.map(_.find([1,2,3], i => i === 2), i => `*${i}*`);
场景2:筛选条件基于转换后的元素
如果你的判断逻辑必须依赖转换后的结果(比如要找转换后包含某个特定字符串的元素),那可以用_.reduce来合并“转换+判断+终止遍历”的逻辑,避免先map整个数组:
const result = _.reduce([1,2,3], (acc, i) => { // 已经找到目标就直接返回,不再遍历 if (acc) return acc; const transformed = `*${i}*`; // 符合条件就返回转换后的值,否则返回undefined继续遍历 return transformed === "*2*" ? transformed : undefined; }, undefined);
或者用_.find配合一个小技巧(利用赋值的返回值),不用外部变量也能拿到转换后的结果:
let result; _.find([1,2,3], i => { result = `*${i}*`; return result === "*2*"; }); // 此时result就是你要的*2*,没找到的话是undefined
为什么不用原来的chain写法?
原来的_.chain().map().find().value()会先把整个数组都map一遍,哪怕目标元素在第一个位置也会遍历完所有元素,效率不如上面的方法。而且写法也更啰嗦,没必要套chain的壳子~
内容的提问来源于stack exchange,提问作者THX-1138
相关产品推荐
相关产品推荐

