【问题标题】:How does _.forEach work in lodash/fp as compared to lodash?与 lodash 相比,_.forEach 在 lodash/fp 中如何工作?
【发布时间】:2022-01-25 05:48:43
【问题描述】:

这个sn-p,它使用lodash's _.forEach

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

打印

a=1
b=2

_.forEachlodash/fp 中如何工作?

如果我尝试上面的 sn-p,在控制台会导致

ƒ (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 并可以访问对象的键和值?

【问题讨论】:

  • 您的第二个 sn-p 应该可以工作(我已经尝试过并且“在我的机器上工作”)。也可以使用咖喱版_.forEach((value, key) => console.log(key + '=' + value))({a: 1, b: 2})
  • 这真的很奇怪......无论如何,希望它可以提供一些启示,我刚刚发现_.VERSION 打印版本。在lodash 上打印4.17.15,而对我来说它打印4.17.4

标签: javascript foreach functional-programming lodash


【解决方案1】:

The parameters of the iteratee function are capped in Lodash FP

引用文档:

上限迭代参数

Iteratee 参数被限制以避免可变参数迭代的陷阱。

// 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() 就是其中之一。仅有的三个将 iteratee 限制为两个是 _.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>

【讨论】:

  • 这是否意味着 Lodash FP 的 _.forEach 在对象上运行时根本不知道键?
  • 正确。如果您想要密钥,可以使用 _.forEach 而不是 _.entries - 我已将其添加到答案中。
猜你喜欢
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
相关资源
最近更新 更多