[英]Group js objects by multiple properties
在下面的示例中,我有一个对象数组,将它们的两个属性进行分组(基于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));
我相信以下分组可以解决问题:
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((map, obj) => { if (!map[obj[mainFilter]]) map[obj[mainFilter]] = {}; [].concat(obj[secFilter]).forEach(subEl => { if (!map[obj[mainFilter]][subEl]) map[obj[mainFilter]][subEl] = []; map[obj[mainFilter]][subEl].push(obj); }); return map; }, {}); console.log(result);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.