与 lodash 相比,_.forEach 在 lodash/fp 中如何工作?

How does _.forEach work in lodash/fp as compared to lodash?

此代码段使用 lodash's _.forEach

_.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
  console.log(key + '=' + value);
})

打印

a=1
b=2

_.forEachlodash/fp 中如何工作?

如果我尝试上面的代码片段,它会在控制台上显示

ƒ (value, key) {
  console.log(key + '=' + value);
}

这接近于“我没有按照我应该的方式使用它”。

如果我尝试反转两个输入(因为这实际上是 lodashlodash/fp 之间的一个主要区别),

_.forEach(function(value, key) {
  console.log(key + '=' + value);
}, { 'a': 1, 'b': 2 })

我明白了

undefined=1
undefined=2

所以我的问题是:有没有办法通过 lodash/fp 在对象上 _.forEach 并访问对象的键和值?

The parameters of the iteratee function are capped in Lodash FP

引用文档:

Capped Iteratee Arguments

Iteratee arguments are capped to avoid gotchas with variadic iteratees.

// The `lodash/map` iteratee receives three arguments:
// (value, index|key, collection)
_.map(['6', '8', '10'], parseInt);
// ➜ [6, NaN, 2]

// The `lodash/fp/map` iteratee is capped at one argument:
// (value)
fp.map(parseInt)(['6', '8', '10']);
// ➜ [6, 8, 10]

Lodash FP 中的不同函数会将迭代对象限制为仅 1 个参数 - _.forEach() 就是其中之一。仅有的三个迭代次数上限为两个的是 _.reduce()_.reduceRight()_.transform().


为了迭代 Lodash FP 中的键和值,您可以使用 _.forEach() 而不是 _.entries()。由于这将条目作为键值对提供,因此您可以解构它们:

const obj = { 'a': 1, 'b': 2 };

_.forEach(function([value, key]) { // destructure the pair
  console.log(key + '=' + value);
}, _.entries(obj))                 // get as pairs
<script src="https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)"></script>

一种更具可读性的方法是将它们组合成 _.flow()

const obj = { 'a': 1, 'b': 2 };
const process = _.flow(
  _.entries,
  _.forEach(function([value, key]) {
    console.log(key + '=' + value);
  })
);
process(obj);
<script src="https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)"></script>

最后,如果您愿意,可以使用 _.spread():

来避免解构

const obj = { 'a': 1, 'b': 2 };
const process = _.flow(
  _.entries,
  _.forEach(_.spread(function(value, key) {
    console.log(key + '=' + value);
  }))
);
process(obj);
<script src="https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)"></script>