【发布时间】:2022-01-16 07:51:56
【问题描述】:
这是一个 JavaScript 对象,
const obj = {a: [{ id: 1 }, {id: 1}, {id: 2}, {id: 3}], b: [{ id: 4 }, {id: 5}, {id: 5}, {id: 6}] };
这是一个代码,它在.id 两个数组ojb.a 和obj.b 中的每一个中正确地对项目进行分组,
const res1 = _.map(obj, x => _.groupBy(x, 'id'));
结果是
[
{
1: [{id: 1}, {id: 1}],
2: [{id: 2}],
3: [{id: 3}]
},
{
4: [{id: 4}],
5: [{id: 5}, {id: 5}],
6: [{id: 6}]
}
]
然而,lambda 实际上只是 _.groupBy 对其第二个参数的部分应用,第二个参数设置为 'id',所以我认为这样的事情应该可以工作,
const res2 = _.map(obj, _.partialRight(_.groupBy, 'id'));
或者至少是这样的
const res2 = _.map(obj, _.partialRight(_.groupBy, x => x.id));
但是,它们都不起作用,都导致了这个对象:
[
{
undefined: [{id: 1}, {id: 1}, {id: 2}, {id: 3}]
},
{
undefined: [{id: 4}, {id: 5}, {id: 5}, {id: 6}]
}
]
这是为什么呢?这是lodash 中的错误吗?还是因为 JavaScript 的工作原理?在后一种情况下,发生了什么?
我找到了一个现有的question + self-answer,它提供了使上述代码工作的解决方案:
const res2 = _.map(obj, _.ary(_.partialRight(_.groupBy, 'id'), 1));
但是我的部分问题仍未得到解答:为什么我需要使用_.ary?为什么我的初始尝试不起作用?
【问题讨论】:
标签: javascript functional-programming lodash partial-application