为什么使用Lodash _.forEach的函数返回原数组而非预期值?
为什么使用Lodash的_.forEach后测试返回原数组而非转换后的数组?
我正在学习Lodash和Vitest,编写了一个简单函数及内联测试,代码如下:
import _ from 'lodash' if (import.meta.vitest) { const { describe, expect, it } = import.meta.vitest; describe('#name', () => { it('should..', () => { expect( collectForEach([1, 2], function (n) { return n * 2; }), ).toEqual([2, 4]); }); }); } function collectForEach(collection, iteratee) { return _.forEach(collection, iteratee); }
测试期望该函数返回数组[2,4],但实际返回[1,2]导致测试失败。请问是我对_.forEach的用法理解有误,还是存在其他类型的错误?
问题原因
你对_.forEach的用法理解确实有误。Lodash的_.forEach核心功能是遍历集合并执行传入的迭代函数,它的返回值始终是原集合本身,不会处理迭代函数的返回值,也不会生成新的数组。你的迭代函数里return n * 2的结果会被忽略,所以最终返回的还是传入的原数组[1,2]。
解决方案
有两种常见的解决方式:
1. 使用_.map替代_.forEach
如果你的需求是将集合中的每个元素转换后生成新数组,应该用_.map——它会自动收集迭代函数的返回值,组成新数组返回:
function collectForEach(collection, iteratee) { return _.map(collection, iteratee); }
2. 手动收集迭代结果(如果一定要用_.forEach)
如果需要保留_.forEach的遍历逻辑,可以手动创建一个新数组,在迭代函数中将处理后的值添加进去,最后返回这个新数组:
function collectForEach(collection, iteratee) { const result = []; _.forEach(collection, (item) => { result.push(iteratee(item)); }); return result; }
修改后重新运行测试,就能得到预期的[2,4]结果了。
内容的提问来源于stack exchange,提问作者cfx78
相关产品推荐
相关产品推荐

