我有这个数据
var data = [
{id:23, family:{familyId:1,name:'AAA',code:'A'},
{id:24, family:{familyId:1,name:'AAA',code:'A'},
{id:25, family:{familyId:2,name:'BBB',code:'B'},
{id:26, family:{familyId:2,name:'BBB',code:'B'}
];
我想按整个对象族分组,但这不起作用:
_(data).groupBy(x => x.family).value();
// Returns {[object Object]: Array(4)}
当然可以。
_(data).groupBy(x => x.family.code).value();
// Returns: {A: Array(2), B: Array(2)}
但是我的键只是一个值,而不是整个对象
最后,我想要这个:
var groupedData = [
{
family:{familyId:1,name:'AAA',code:'A'},
data:[
{id:23, family:{familyId:1,name:'AAA',code:'A'},
{id:24, family:{familyId:1,name:'AAA',code:'A'}
]
},
{
family:{familyId:2,name:'BBB',code:'B'},
data:[
{id:25, family:{familyId:2,name:'BBB',code:'B'},
{id:26, family:{familyId:2,name:'BBB',code:'B'}
]
},
];
答案 0 :(得分:1)
在 lodash 中,您可以执行以下操作:
var data = [{ id: 23, family: { familyId: 1, name: 'AAA', code: 'A' } }, { id: 24, family: { familyId: 1, name: 'AAA', code: 'A' } }, { id: 25, family: { familyId: 2, name: 'BBB', code: 'B' } }, { id: 26, family: { familyId: 2, name: 'BBB', code: 'B' } } ];
const result = _.chain(data)
.groupBy('family.familyId')
.mapValues(x => ({ family: _.head(x).family, data: x }))
.values()
.value()
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
groupBy
是familyId
的后跟values
和reduce
的分组,以到达所需的对象。
使用 ES6 ,您可以执行类似操作:
var data = [{ id: 23, family: { familyId: 1, name: 'AAA', code: 'A' } }, { id: 24, family: { familyId: 1, name: 'AAA', code: 'A' } }, { id: 25, family: { familyId: 2, name: 'BBB', code: 'B' } }, { id: 26, family: { familyId: 2, name: 'BBB', code: 'B' } } ];
const grp = (d,i) =>
d.reduce((r,c) => (r[c.family[i]] = [...r[c.family[i]] || [], c], r), {})
const r = Object.values(grp(data,'familyId')).map(x=>({family: x[0], data: x}))
console.log(r)
为此想法量身定制的自定义groupBy
,然后是Object.values
,然后将值映射到所需的输出。