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