使用Lodash将另一个对象中的特定值分组

时间:2018-12-05 10:30:17

标签: lodash

使用Lodash 4.17.11,如何使用groupBy按值分组?让我解释一下:

对象数组:

{
  a: 88,
  b: 11,
},
{
  a: 99,
  b: 88
},
{
  a: 22,
  b: 10
}

预期结果:

88: [{
  a: 88,
  b: 11
},
{
  a: 99,
  b: 88
}]

执行以下操作将基于实际的key

._groupBy(array, (arr) => arr.a)

但是我需要按实际值分组。我说得通吗如果另一个对象中的ba相同,则将其分组。

我正在使用没有结构的旧代码库。谢谢。

2 个答案:

答案 0 :(得分:2)

您可以使用 ES6 Array.reduce以相对简洁的方式执行此操作:

const group = arr => arr.reduce((r,{a,b}) => {
  if(!r[a] && !r[b]) r[a] = r[b] = {a,b}
  else {
   if(r[a]) r.grp[a] = [...r.grp[a] || [r[a]], {a,b}]
   if(r[b]) r.grp[b] = [...r.grp[b] || [r[b]], {a,b}]
  }
  return r
}, {grp: {}}).grp

console.log(group([{ a: 88, b: 11, }, { a: 99, b: 88 }, { a: 22, b: 10 }]))
console.log(group([{ a: 88, b: 11, }, { a: 99, b: 88 }, { a: 22, b: 10 }, { a: 22, b: 88 }]))

我还认为,这应该比在groupBy上执行1 'a',然后在'b'上执行另一个,然后再像{ {1}}。

但是,如果您想要 lodash ,则可以执行以下操作:

_.mergeBy
lodash

将每个道具分组的位置,然后仅合并具有相同const group = arr => { return _.pickBy( _.mergeWith( _.groupBy(arr, 'a'), _.groupBy(arr, 'b'), (ov,sv,k,o,s) => o[k] && s[k] ? o[k].concat(s[k]) : false ), x => _.isArray(x) && x.length > 1) } console.log(group([{ a: 88, b: 11, }, { a: 99, b: 88 }, { a: 22, b: 10 }])) console.log(group([{ a: 88, b: 11, }, { a: 99, b: 88 }, { a: 22, b: 10 }, { a: 22, b: 88 }]))的那些数组,然后由于输出位于<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>中,因此仅key具有{ {1}}。

答案 1 :(得分:1)

您需要将您关心的每个值分组,然后将所有内容合并在一起。

_.merge(
  _.groupBy(array, (arr) => arr.a),
  _.groupBy(array, (arr) => arr.b)
)

如果您有嵌套的对象,可能会更复杂一些;那么我建议只编写一个自定义合并功能。