我在更新链式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包装器,但是不知道为什么会发生。
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
会返回包装的数组,我不知道。这可能是错误或疏忽,也可能是故意的行为。