首页 > 解决方案 > 如何在 Lodash 中修改 groupBy 结果

问题描述

如何修改我的脚本,导致没有关键的“作者”(我只想有歌曲和地点)?歌曲列表是这样的(显然我没有复制整个列表)

const lp3 = [
    {
        author: 'Queen',
        song: 'Bohemian Rhapsody',
        place: 1,
        change: 0
    },
    {
        author: 'Deep Purple',
        song: 'Child in time',
        place: 2,
        change: 2
    },

和我的脚本:

const exercise10 = _.groupBy(lp3, "author")

结果是例如:

Pink Floyd': [
    {
      author: 'Pink Floyd',
      song: 'Shine on you crazy diamond',
      place: 12,
      change: 4
    },
    {
      author: 'Pink Floyd',
      song: 'Comfortably numb',
      place: 15,
      change: 7
    },
    { author: 'Pink Floyd', song: 'Hey you', place: 18, change: 11 },
    {
      author: 'Pink Floyd',
      song: 'Another brick in the wall part II',
      place: 21,
      change: 10
    }
  ],

标签: javascriptfunctional-programminglodash

解决方案


使用Array.reduce()or lodash's_.reduce()你可以解构每个对象,取出author,然后对对象进行分组:

const lp3 = [{"author":"Queen","song":"Bohemian Rhapsody","place":1,"change":0},{"author":"Deep Purple","song":"Child in time","place":2,"change":2}]

const result = _.reduce(lp3, (acc, { author, ...o }) => {
  if(!acc[author]) acc[author] = []

  acc[author].push(o)

  return acc
}, {})

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"></script>

如果要使用_.groupBy(),您需要对项目进行分组,然后使用 映射组_.mapValues(),并将项目映射到 omit author

const lp3 = [{"author":"Queen","song":"Bohemian Rhapsody","place":1,"change":0},{"author":"Deep Purple","song":"Child in time","place":2,"change":2}]

const result1 = _.mapValues(
  _.groupBy(lp3, 'author'),
  values => _.map(values, o => _.omit(o, 'author')),
)

// or using chaining

const result2 = _(lp3)
  .groupBy(lp3, 'author') // create the groups
  .mapValues(values => // map the values of the groups x
    _.map(values, o => _.omit(o, 'author')) // map the items
  )
  .value()

console.log(result1)
console.log(result2)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous"></script>


推荐阅读