Использование Lodash для группировки определенного значения в другом объекте - PullRequest
0 голосов
/ 05 декабря 2018

Используя 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)

Но мне нужно сгруппировать по фактическому значению.Имею ли я смысл?Если b совпадает с a в другом объекте, сгруппируйте его.

Я работаю со старой базой кода, где вещи не структурированы.Благодаря.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Вы можете сделать это в относительно сжатой форме с 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 }]))

Я бы также сказал, что это должно быть значительно быстрее, чем 1 groupBy на 'a', затем еще один на 'b' и затем еще один цикл на _.mergeBy как с lodash.

Но если вы хотите 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, а затем, поскольку выход находится в arraysпросто pickBy те, которые имеют more than 1 item в них.

0 голосов
/ 05 декабря 2018

Вам нужно сгруппировать по каждому значению, которое вас волнует, а затем объединить все вместе.

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

Возможно, это будет немного сложнее, если у вас есть вложенные объекты;тогда я бы предложил просто написать пользовательскую функцию слияния.

...