【问题标题】:lodash: create groups from array of properties in array of objectslodash:从对象数组中的属性数组创建组
【发布时间】:2017-05-20 22:55:54
【问题描述】:

我最近一直在使用 lodash,我就是喜欢它。所以我正在努力学习它。

在过去的两天里,我一直试图弄清楚如何执行以下操作,但没有取得多大成功:考虑一个对象数组,每个对象在属性props...中都有一个对象数组...

let items = [{
  name: 'first',
  props: [{
    id: 1,
    name: 'one'
  }, {
    id: 2,
    name: 'two'
  }]
}, {
  name: 'second',
  props: [{
    id: 2,
    name: 'two'
  }]
}, {
  name: 'third',
  props: [{
    id: 1,
    name: 'one'
  }]
}];

...我想创建一个对象数组,其中包含 props 中所有项目的每个属性,每个对象都有一个 items 属性,所有项目都包含该属性,如下所示:

[{
  id: 1,
  name: 'one',
  items : [] // array containing objects `first` and 'third'
},{
  id: 2,
  name: 'two',
  items: [] // array containing objects `first` and 'second'
}]

我尝试了各种组合,灵感来自this question 的答案,这似乎是我能找到的最接近我正在尝试做的事情。我认为我真正的障碍是,当尝试创建一系列独特的道具时(我将把项目映射到那里)并尝试使用......

_(items).chain().flatten().pluck('props').unique().value()

...如this answer,它告诉我.chain(...).flatten(...).pluck 不是函数。我也尝试使用.map 而不是.pluck,但我想并不是所有在Underscore 中工作的东西都可以在Lodash 中工作(我不知道具体的区别,我刚读到Lodash 最初是从Underscore 分叉的)。

注意我知道如何使用经典的fors 来做到这一点,这只是一个练习。我没有实际用途。

我只是想学习充分利用lodash 的潜力。如果你知道怎么做,你甚至不必解释。我会console.log() 每一步,直到我明白发生了什么。另外,如果您认为我的问题名称可以改进,以便更好地索引,考虑到我想要实现的目标,我愿意接受建议。

理想情况下,答案应该是lodash 方法链,而不声明中间变量。我很确定这是可行的(这就是我问的原因)。当然,步骤越少越好——我认为它会影响现实生活场景中的性能,但这不是问题——我知道大多数时候,在追求性能时,经典的 for 循环很难打败。

【问题讨论】:

    标签: javascript arrays grouping lodash


    【解决方案1】:

    首先,让我们将每个 item 转换为带有 item 名称的 props 数组,将这个数组数组展平,然后剩下的应该会更容易。

     _(data)
      .chain()
      .flatMap(({ props, name }) => _.map(props, p => ({
        id: p.id,
        name: p.name,
        item: name
      })))
      .groupBy(p => p.id)
      .map(props => ({
        id: _.head(props).id,
        name: _.head(props).name,
        items: _.map(props, p => p.item)
      }))
      .value();
    

    【讨论】:

    • 组内的项目不是初始对象,只是它们的名称,但已经足够接近了。立即查看flatmap()。谢谢。
    • 我没有仔细阅读,以为只需要名字,看看这行items: _.map(props, p => p.item)实际上,props 有你需要的一切:)
    • 真的很有帮助。直到现在才知道_.head()_flatMap()。我做了一个playground here。再次感谢您。
    • 顺便说一句,您现在可以在 lodash 中使用 _.map(props,'item') 而不是 _.map(props, p => p.item) :)。 .groupBy('id') 也一样。
    猜你喜欢
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    相关资源
    最近更新 更多