使用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
相同,则将其分组。
我正在使用没有结构的旧代码库。谢谢。
答案 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)
)
如果您有嵌套的对象,可能会更复杂一些;那么我建议只编写一个自定义合并功能。