按嵌套键对数组进行分组
Group array by nested keys
有谁知道 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 来纠正和改进它。提前致谢
如果你想使用地图,你可以这样尝试:
let yourArray = Object.keys(stores).map(key => stores[key])
还有其他方法可以做到这一点,但您在此处描述的内容符合 id => val 查找。
您首先创建一个包含所有键的数组(因此{}.ptj.desc
),然后将所有对象映射到一个新对象(映射),其键与上述数组的键匹配,然后...利润。
参见下面的示例。希望这就是您要找的。
var mainStore = [
{
"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"
}
}
];
var idList = mainStore.map(item => item.ptj.desc);
var dataMap = mainStore.reduce(( dataMap, item ) => {
dataMap[ item.ptj.desc ] = item;
return dataMap;
}, {});
// Then do everything based on idList
var onlyCodes = idList.map(id => dataMap[ id ].ptj.code);
var onlyNames = idList.map(id => dataMap[ id ].name);
console.log(onlyCodes);
console.log(onlyNames);
您可以使用 reduce()
按 ptj.desc
或 ptj.code
分组。下面的示例使用 ptj.desc
.
let proj = [{"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"}}]
result = proj.reduce(function (a, c) {
a[c.ptj.desc] = a[c.ptj.desc] || [];
a[c.ptj.desc].push(c)
return a;
}, Object.create(null));
console.log(result);
如果您只想将具有相同 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>
有谁知道 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 来纠正和改进它。提前致谢
如果你想使用地图,你可以这样尝试:
let yourArray = Object.keys(stores).map(key => stores[key])
还有其他方法可以做到这一点,但您在此处描述的内容符合 id => val 查找。
您首先创建一个包含所有键的数组(因此{}.ptj.desc
),然后将所有对象映射到一个新对象(映射),其键与上述数组的键匹配,然后...利润。
参见下面的示例。希望这就是您要找的。
var mainStore = [
{
"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"
}
}
];
var idList = mainStore.map(item => item.ptj.desc);
var dataMap = mainStore.reduce(( dataMap, item ) => {
dataMap[ item.ptj.desc ] = item;
return dataMap;
}, {});
// Then do everything based on idList
var onlyCodes = idList.map(id => dataMap[ id ].ptj.code);
var onlyNames = idList.map(id => dataMap[ id ].name);
console.log(onlyCodes);
console.log(onlyNames);
您可以使用 reduce()
按 ptj.desc
或 ptj.code
分组。下面的示例使用 ptj.desc
.
let proj = [{"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"}}]
result = proj.reduce(function (a, c) {
a[c.ptj.desc] = a[c.ptj.desc] || [];
a[c.ptj.desc].push(c)
return a;
}, Object.create(null));
console.log(result);
如果您只想将具有相同 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>