gpt4 book ai didi

javascript - 按多个属性对 js 对象进行分组

转载 作者:行者123 更新时间:2023-12-01 01:47:17 25 4
gpt4 key购买 nike

在下面的示例中,我有一个对象数组,我按 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));

关于javascript - 按多个属性对 js 对象进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51858490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com