You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:20:22