与 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
_.forEach
在 lodash/fp
中如何工作?
如果我尝试上面的代码片段,它会在控制台上显示
ƒ (value, key) {
console.log(key + '=' + value);
}
这接近于“我没有按照我应该的方式使用它”。
如果我尝试反转两个输入(因为这实际上是 lodash
和 lodash/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>
此代码段使用 lodash's _.forEach
、
_.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
console.log(key + '=' + value);
})
打印
a=1
b=2
_.forEach
在 lodash/fp
中如何工作?
如果我尝试上面的代码片段,它会在控制台上显示
ƒ (value, key) {
console.log(key + '=' + value);
}
这接近于“我没有按照我应该的方式使用它”。
如果我尝试反转两个输入(因为这实际上是 lodash
和 lodash/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>