javascript - 通过多个属性对 js 对象进行分组
问题描述
在下面的示例中,我有一组对象,我按它们的 2 个属性分组(基于https://stackoverflow.com/a/40142591)。
var arr = [{
"id": 1,
"tags": "main",
"yearCode": "2018"
}, {
"id": 2,
"tags": ["main", "blue"],
"yearCode": "2018"
}, {
"id": 3,
"tags": ["main", "green"],
"yearCode": "2018"
}, {
"id": 25,
"tags": ["green"],
"yearCode": "2018"
}, {
"id": 26,
"tags": ["important"],
"yearCode": "2017"
}, {
"id": 29,
"tags": ["important", "blue"],
"yearCode": "2017"
}, {
"id": 2,
"tags": ["important", "green"],
"yearCode": "2017"
}];
var mainFilter = "yearCode";
var secFilter = "tags";
var result = arr.reduce(function(map, obj) {
var f1 = map[obj[mainFilter]] = map[obj[mainFilter]] || {};
var f2 = f1[obj[secFilter]] = f1[obj[secFilter]] || [];
f2.elements.push(obj);
return map;
}, Object.create(null));
console.log(JSON.stringify(result));
// NOW
{
"2017": {
"important": [
{
"id": 26,
"tags": ["important"],
"yearCode": "2017"
}
],
"important,blue": [
{
"id": 29,
"tags": ["important","blue"],
"yearCode": "2017"
}
],
"important,green": [
{
"id": 2,
"tags": ["important","green"],
"yearCode": "2017"
}
]
},
"2018": {
"main": [
{
"id": 1,
"tags": ["main"],
"yearCode": "2018"
}
],
"main,blue": [
{
"id": 2,
"tags": ["main","blue"],
"yearCode": "2018"
}
],
"main,green": [
{
"id": 3,
"tags": ["main","green"],
"yearCode": "2018"
}
],
"green": [
{
"id": 25,
"tags": ["green"],
"yearCode": "2018"
}
]
}
}
但是,我希望结果采用以下格式:
{
"2017": {
"important": [
{
"id": 26,
"tags": ["important"],
"yearCode": "2017"
},
{
"id": 29,
"tags": ["important","blue"],
"yearCode": "2017"
},
{
"id": 2,
"tags": ["important","green"],
"yearCode": "2017"
}
],
"blue": [
{
"id": 29,
"tags": ["important","blue"],
"yearCode": "2017"
}
],
"green": [
{
"id": 2,
"tags": ["important","green"],
"yearCode": "2017"
}
]
},
"2018": {
"main": [
{
"id": 1,
"tags": ["main"],
"yearCode": "2018"
},
{
"id": 2,
"tags": ["main","blue"],
"yearCode": "2018"
},
{
"id": 3,
"tags": ["main","green"],
"yearCode": "2018"
}
],
"blue": [
{
"id": 2,
"tags": ["main","blue"],
"yearCode": "2018"
}
],
"green": [
{
"id": 3,
"tags": ["main","green"],
"yearCode": "2018"
},
{
"id": 25,
"tags": ["green"],
"yearCode": "2018"
}
]
}
}
上例中的组仅包含数组中的一个元素,如果需要,每个元素都可以复制。
编辑:如果“mainFilter”也是一个数组,我希望发生同样的事情(例如:如果 yearCode 是 [“2018”,”2017”],它将创建另一个组,就像它在“secFilter”中一样)
编辑2:通过添加一个循环来拆分值来解决
解决方案
这是你想要的 ?
var arr = [{
"id": 1,
"tags": "main",
"yearCode": "2018"
}, {
"id": 2,
"tags": ["main", "blue"],
"yearCode": "2018"
}, {
"id": 3,
"tags": ["main", "green"],
"yearCode": "2018"
}, {
"id": 25,
"tags": ["green"],
"yearCode": "2018"
}, {
"id": 26,
"tags": ["important"],
"yearCode": "2017"
}, {
"id": 29,
"tags": ["important", "blue"],
"yearCode": "2017"
}, {
"id": 2,
"tags": ["important", "green"],
"yearCode": "2017"
}];
var mainFilter = "yearCode";
var secFilter = "tags";
var result = arr.reduce(function(map, obj)
{
var f1 = map[obj[mainFilter]] = map[obj[mainFilter]] || {};
if(Object.prototype.toString.call(obj[secFilter]) === '[object Array]')
{
var idx;
for(idx in obj[secFilter])
{
var f2 = f1[obj[secFilter][idx]] = f1[obj[secFilter][idx]] || [];
f2.push(obj);
}
}
else
{
var f2 = f1[obj[secFilter]] = f1[obj[secFilter]] || [];
f2.push(obj);
}
return map;
}, Object.create(null));
console.log(JSON.stringify(result));
推荐阅读
- tensorflow - 如何将 tfjs-node 与从源代码构建的 libtensorflow 一起使用
- python - 理解一行代码中的不同功能
- ios - UIScrollview 在 IOS Objective C 中总是弹回顶部
- java - java.lang.IllegalArgumentException 与搜索
- vba - 是否可以使用 vba 将 Windows 窗体居中?
- angularjs - Angularjs 选择器迁移到 Angular 6
- crystal-reports - 将字符串拆分为两部分并与另一列连接
- elasticsearch - Elasticsearch 子字符串必须包含在字段中
- apache-kafka - 在 kafka 中向许多应用程序发送消息的最佳实践
- debezium - 如何使用 java 捕获 Embedded-debezium 数据库连接失败?