【问题标题】:How to modify the groupBy result in Lodash如何在 Lodash 中修改 groupBy 结果
【发布时间】:2021-07-08 12:13:28
【问题描述】:

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

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
    }
  ],

【问题讨论】:

    标签: javascript functional-programming lodash


    【解决方案1】:

    使用Array.reduce()或lodash的_.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()映射组,并将项目映射到省略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>

    【讨论】:

    • 不幸的是我不能使用reduce,我只能使用lodash的函数......在groupBy之后我被阻止了,我不知道如何改变......
    • 还添加了一个 lodash 答案。
    • 您使用的是 lodash 链接还是 lodash/fp?
    • 老实说 - 我是一名学生,只上过一节 Lodash 课,只是为了熟悉它,并且只需要使用文档:在 lodash.com
    • 它映射对象的值,所以如果你有一个对象{ key1: val1, key2: val2, key3: val3 },mapValues会迭代对象的值(val1val2val3),并返回新的而是那些。所以mapValues({ key1: 1, key2: 2, key3: 3 }, v => v + 1) 会返回{ key1: 2, key2: 3, key3: 4 }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 2010-12-18
    相关资源
    最近更新 更多