lodash 中的 keyBy 问题。 Lodash 删除了一些属性
Problem with keyBy in lodash. Lodash removed some properties
例如我有一个数组
let arr = [{a:1, b:2, c:3}, {a:1, b:2}, {a:2, c:3}, {a:2, c:3} ];
并且我使用了 keyBy 函数
const f = _.keyBy(arr, e => e.a);
结果是
1: {a: 1, b: 2}
2: {a: 2, c: 3}
但是我需要所有属性,我期望的结果是
1: {a: 1, b: 2, c:3}
2: {a: 2, c: 3}
我必须做什么?
按 a
对项目进行分组,然后使用 _.mapValues()
迭代该组,并将每个组合并为一个对象:
const arr = [{a:1, b:2, c:3}, {a:1, b:2}, {a:2, c:3}, {a:2, c:3} ];
const result = _.mapValues(
_.groupBy(arr, 'a'),
group => _.merge({}, ...group)
)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
使用 lodash/fp 您可以使用相同的想法创建一个更简洁的函数:
const { flow, groupBy, mapValues, mergeAll } = _
const fn = flow(
groupBy('a'),
mapValues(mergeAll),
)
const arr = [{a:1, b:2, c:3}, {a:1, b:2}, {a:2, c:3}, {a:2, c:3} ];
const result = fn(arr)
console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
例如我有一个数组
let arr = [{a:1, b:2, c:3}, {a:1, b:2}, {a:2, c:3}, {a:2, c:3} ];
并且我使用了 keyBy 函数
const f = _.keyBy(arr, e => e.a);
结果是
1: {a: 1, b: 2}
2: {a: 2, c: 3}
但是我需要所有属性,我期望的结果是
1: {a: 1, b: 2, c:3}
2: {a: 2, c: 3}
我必须做什么?
按 a
对项目进行分组,然后使用 _.mapValues()
迭代该组,并将每个组合并为一个对象:
const arr = [{a:1, b:2, c:3}, {a:1, b:2}, {a:2, c:3}, {a:2, c:3} ];
const result = _.mapValues(
_.groupBy(arr, 'a'),
group => _.merge({}, ...group)
)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
使用 lodash/fp 您可以使用相同的想法创建一个更简洁的函数:
const { flow, groupBy, mapValues, mergeAll } = _
const fn = flow(
groupBy('a'),
mapValues(mergeAll),
)
const arr = [{a:1, b:2, c:3}, {a:1, b:2}, {a:2, c:3}, {a:2, c:3} ];
const result = fn(arr)
console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>