有谁知道ES6或Ramda通过对象密钥对对象数组进行分组然后基于分组创建新对象数组的方法吗?例如,我有一个对象数组,如下所示:
[
{
"name": "ABCD123",
"code": "GFDGF",
"ptj": {
"code": "123",
"desc": "ABCD 123"
}
},
{
"name": "ANGGUN",
"code": "DSFD54",
"ptj": {
"code": "111",
"desc": "111 123"
}
},
{
"name": "GDFDGG",
"code": "HJ2",
"ptj": {
"code": "111",
"desc": "111 123"
}
},
{
"name": "POT",
"code": "POT89",
"ptj": {
"code": "222",
"desc": "222 123"
}
},
{
"name": "POTER UTAMA",
"code": "POTER345",
"ptj": {
"code": "123",
"desc": "ABCD 123"
}
},
{
"name": "ABCD123ABCD",
"code": "LOLL23",
"ptj": {
"code": "123",
"desc": "ABCD 123"
}
},
{
"name": "ANGGUN 2",
"code": "DSFD54",
"ptj": {
"code": "111",
"desc": "111 123"
}
},
{
"name": "GDFDGG",
"code": "HJ2",
"ptj": {
"code": "111",
"desc": "111 123"
}
},
{
"name": "POT",
"code": "POT89",
"ptj": {
"code": "222",
"desc": "222 123"
}
},
{
"name": "POTER UTAMA",
"code": "POTER345",
"ptj": {
"code": "123",
"desc": "ABCD 123"
}
}
]
我想有一个按ptj.desc
或分组的新数组ptj.code
:
[
{
"PTJ": "ABCD 123",
"data": [
{
"name": "ABCD123",
"code": "GFDGF",
"ptj": {
"code": "123",
"desc": "ABCD 123"
}
},
{
"name": "POTER UTAMA",
"code": "POTER345",
"ptj": {
"code": "123",
"desc": "ABCD 123"
}
},
{
"name": "ABCD123ABCD",
"code": "LOLL23",
"ptj": {
"code": "123",
"desc": "ABCD 123"
}
},
{
"name": "POTER UTAMA",
"code": "POTER345",
"ptj": {
"code": "123",
"desc": "ABCD 123"
}
}
]
},
{
"PTJ": "111 123",
"data": [
{
"name": "ANGGUN",
"code": "DSFD54",
"ptj": {
"code": "111",
"desc": "111 123"
}
},
{
"name": "GDFDGG",
"code": "HJ2",
"ptj": {
"code": "111",
"desc": "111 123"
}
},
{
"name": "ANGGUN 2",
"code": "DSFD54",
"ptj": {
"code": "111",
"desc": "111 123"
}
},
]
},
{
"PTJ": "222 123",
"data": [
{
"name": "POT",
"code": "POT89",
"ptj": {
"code": "222",
"desc": "222 123"
}
},
{
"name": "POT",
"code": "POT89",
"ptj": {
"code": "222",
"desc": "222 123"
}
},
]
}
]
到目前为止,我所拥有的是
const stores = myArray.reduce((r, a) => {
r[a.ptj.desc] = r[a.ptj.desc] || [];
r[a.ptj.desc].push(a);
return r;
}, {});
不幸的是,它转换为对象,我不能使用array.map
。我做错什么了?我欢迎使用ES6或ramda进行更正和改进。提前致谢
如果您只想将具有相同ptj.desc
值的对象分组,而又不介意结果值是具有键索引的对象,则可以R.groupBy
这样使用:
const data = [
{
"name": "ABCD123",
"code": "GFDGF",
"ptj": {
"code": "123",
"desc": "ABCD 123"
}
},
{
"name": "ANGGUN",
"code": "DSFD54",
"ptj": {
"code": "111",
"desc": "111 123"
}
},
{
"name": "GDFDGG",
"code": "HJ2",
"ptj": {
"code": "111",
"desc": "111 123"
}
},
{
"name": "POT",
"code": "POT89",
"ptj": {
"code": "222",
"desc": "222 123"
}
},
{
"name": "POTER UTAMA",
"code": "POTER345",
"ptj": {
"code": "123",
"desc": "ABCD 123"
}
},
{
"name": "ABCD123ABCD",
"code": "LOLL23",
"ptj": {
"code": "123",
"desc": "ABCD 123"
}
},
{
"name": "ANGGUN 2",
"code": "DSFD54",
"ptj": {
"code": "111",
"desc": "111 123"
}
},
{
"name": "GDFDGG",
"code": "HJ2",
"ptj": {
"code": "111",
"desc": "111 123"
}
},
{
"name": "POT",
"code": "POT89",
"ptj": {
"code": "222",
"desc": "222 123"
}
},
{
"name": "POTER UTAMA",
"code": "POTER345",
"ptj": {
"code": "123",
"desc": "ABCD 123"
}
}
]
const fn = R.groupBy(R.path(['ptj','desc']))
console.log(fn(data))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
如果确实希望获得与问题示例相同的结构,则可以使用和组成上述内容R.map
,如下所示:R.zipObj
R.toPairs
const data = [
{
"name": "ABCD123",
"code": "GFDGF",
"ptj": {
"code": "123",
"desc": "ABCD 123"
}
},
{
"name": "ANGGUN",
"code": "DSFD54",
"ptj": {
"code": "111",
"desc": "111 123"
}
},
{
"name": "GDFDGG",
"code": "HJ2",
"ptj": {
"code": "111",
"desc": "111 123"
}
},
{
"name": "POT",
"code": "POT89",
"ptj": {
"code": "222",
"desc": "222 123"
}
},
{
"name": "POTER UTAMA",
"code": "POTER345",
"ptj": {
"code": "123",
"desc": "ABCD 123"
}
},
{
"name": "ABCD123ABCD",
"code": "LOLL23",
"ptj": {
"code": "123",
"desc": "ABCD 123"
}
},
{
"name": "ANGGUN 2",
"code": "DSFD54",
"ptj": {
"code": "111",
"desc": "111 123"
}
},
{
"name": "GDFDGG",
"code": "HJ2",
"ptj": {
"code": "111",
"desc": "111 123"
}
},
{
"name": "POT",
"code": "POT89",
"ptj": {
"code": "222",
"desc": "222 123"
}
},
{
"name": "POTER UTAMA",
"code": "POTER345",
"ptj": {
"code": "123",
"desc": "ABCD 123"
}
}
]
const fn = R.groupBy(R.path(['ptj','desc']))
const fn2 = R.compose(R.map(R.zipObj(['PTJ', 'data'])), R.toPairs, fn)
console.log(fn2(data))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句