为什么Lodash包装器不适用于forEach?

问题描述 投票:-1回答:1

我在更新链式lodash操纵时遇到了这个问题,我不明白为什么它会以不同的方式工作

我将其范围缩小为在lodash包装器上链接forEach

let tab = [{a:1, b:1}, {a:1, b:2}, {a:2, b:1},{a:2, b:2}]
let res = _(tab).forEach(el => {el.c = 3; return el;}).groupBy('a')
console.log(res)

https://jsbin.com/wahokezeja/edit?js,console

这将引发错误:

“ TypeError:_(...)。forEach(...)。groupBy不是函数

但是与地图链接时,它可以正常工作

let tab = [{a:1, b:1}, {a:1, b:2}, {a:2, b:1},{a:2, b:2}]
let res = _(tab).map(el => {el.c = 3; return el;}).groupBy('a').value()
console.log(res)

https://jsbin.com/mofusel/1/edit?js,console

它与_(tab)有关。forEach返回一个数组而不是lodash包装器,但是不知道为什么会发生。

javascript arrays lodash wrapper
1个回答
0
投票

lodash forEach的行为与JS forEach并不完全一样,但与map也不完全相同。 _.map([1,2,3],a=>2*a)将返回您期望的数组[2,4,6],但是_.forEach([1,2,3],a=>a*2)返回[1,2,3]。它旨在对每个数组元素执行操作(如JS [].forEach),但它不会返回修改后的数组,而是为了方便而返回原始数组。如果要修改数组,请使用map

尝试以下操作:

var arr=[1,2,3]; 
var rslt=_(arr).forEach(v=>v*2); 
console.log(arr===rslt);

您可以看到它返回true-forEach中的'结果',无论是否包装,都只是原始数组。

关于forEach的包装版本为什么不返回包装的数组而map会返回包装的数组,我不知道。这可能是错误或疏忽,也可能是故意的行为。

© www.soinside.com 2019 - 2024. All rights reserved.