数据结构转换,如何能方便快捷?
在工作有一个场景,如下图
我们在处理数据时认为每个一级条件下的二级条件是或的关系,每个一级条件间是且的关系,具体数据组织形式为测试数据中的原数据,但是条件筛选服务器接收的参数在同一个筛选条件下只有且的关系,不同的筛选条件间是或的关系,因此需要将原数据转换为输出数据的形式,以上图为例,三种筛选条件下的7个子条件重新排列组合后生成12个筛选条件,
即:
- 偏好开车当天购票 且 为男性 且 偏好低端消费。
- 偏好开车当天购票 且 为男性 且 偏好高端消费。
- 偏好开车前4-7天购票 且 为男性 且 偏好低端消费。
- 偏好开车前4-7购票 且 为男性 且 偏好高端消费。
- 偏好开车前1-3天购票 且 为男性 且 偏好低端消费。
- 偏好开车前1-3天购票 且 为男性 且 偏好高端消费。
- 偏好开车当天购票 且 为女性 且 偏好低端消费。
- 偏好开车当天购票 且 为女性 且 偏好高端消费。
- 偏好开车前4-7天购票 且 为女性 且 偏好低端消费。
- 偏好开车前4-7购票 且 为女性 且 偏好高端消费。
- 偏好开车前1-3天购票 且 为女性 且 偏好低端消费。
- 偏好开车前1-3天购票 且 为女性 且 偏好高端消费。
要求一级筛选条件数量不确定,每个一级条件下的二级条件不确定。
不限语言。
原数据:
[ {
"unionSet": [
{
"name": "偏好开车当天购票",
"pid": "030080000",
"id": "030080001"
},
{
"name": "偏好开车前1~3天购票",
"pid": "030080000",
"id": "030080002"
},
{
"name": "偏好开车前4~7天购票",
"pid": "030080000",
"id": "030080003"
},
{
"name": "偏好低端消费",
"pid": "010040000",
"id": "010040001"
},
{
"name": "偏好中端消费",
"pid": "010040000",
"id": "010040002"
},
{
"name": "偏好高端消费",
"pid": "010040000",
"id": "010040003"
},
{
"name": "10岁以下",
"pid": "020020000",
"id": "020020001"
},
{
"name": "10岁~15岁",
"pid": "020020000",
"id": "020020002"
},
{
"name": "15岁~44岁",
"pid": "020020000",
"id": "020020003"
},
{
"name": "44岁~59岁",
"pid": "020020000",
"id": "020020004"
}
]
},
{
"unionSet": [
{
"name": "偏好周末出行",
"pid": "010030000",
"id": "010030001"
},
{
"name": "偏好周二到周四出行",
"pid": "010030000",
"id": "010030003"
},
{
"name": "偏好周五出行",
"pid": "010030000",
"id": "010030002"
},
{
"name": "女",
"pid": "020010000",
"id": "020010002"
}
]
},
{
"unionSet": [
{
"name": "偏好出发二线城市",
"pid": "010020000",
"id": "010020002"
},
{
"name": "偏好出发三线以上城市",
"pid": "010020000",
"id": "010020001"
},
{
"name": "44岁~59岁",
"pid": "020020000",
"id": "020020004"
},
{
"name": "15岁~44岁",
"pid": "020020000",
"id": "020020003"
}
]
}
]
要求输出的数据:
[ {
"unionSet": [
{
"id": "030080003",
"label": "偏好开车前4~7天购票"
},
{
"id": "010040002",
"label": "偏好中端消费"
},
{
"id": "020020004",
"label": "44岁~59岁"
}
]
},
{
"unionSet": [
{
"id": "030080003",
"label": "偏好开车前4~7天购票"
},
{
"id": "010040002",
"label": "偏好中端消费"
},
{
"id": "020020003",
"label": "15岁~44岁"
}
]
},
{
"unionSet": [
{
"id": "030080002",
"label": "偏好开车前1~3天购票"
},
{
"id": "010040001",
"label": "偏好低端消费"
},
{
"id": "020020002",
"label": "10岁~15岁"
}
]
},
{
"unionSet": [
{
"id": "030080002",
"label": "偏好开车前1~3天购票"
},
{
"id": "010040001",
"label": "偏好低端消费"
},
{
"id": "020020001",
"label": "10岁以下"
}
]
},
{
"unionSet": [
{
"id": "030080002",
"label": "偏好开车前1~3天购票"
},
{
"id": "010040001",
"label": "偏好低端消费"
},
{
"id": "020020004",
"label": "44岁~59岁"
}
]
},
{
"unionSet": [
{
"id": "030080002",
"label": "偏好开车前1~3天购票"
},
{
"id": "010040001",
"label": "偏好低端消费"
},
{
"id": "020020003",
"label": "15岁~44岁"
}
]
},
{
"unionSet": [
{
"id": "030080003",
"label": "偏好开车前4~7天购票"
},
{
"id": "010040002",
"label": "偏好中端消费"
},
{
"id": "020020002",
"label": "10岁~15岁"
}
]
},
{
"unionSet": [
{
"id": "030080003",
"label": "偏好开车前4~7天购票"
},
{
"id": "010040002",
"label": "偏好中端消费"
},
{
"id": "020020001",
"label": "10岁以下"
}
]
},
{
"unionSet": [
{
"id": "030080001",
"label": "偏好开车当天购"
},
{
"id": "010040001",
"label": "偏好低端消费"
},
{
"id": "020020002",
"label": "10岁~15岁"
}
]
},
{
"unionSet": [
{
"id": "030080001",
"label": "偏好开车当天购"
},
{
"id": "010040001",
"label": "偏好低端消费"
},
{
"id": "020020003",
"label": "15岁~44岁"
}
]
},
{
"unionSet": [
{
"id": "030080001",
"label": "偏好开车当天购"
},
{
"id": "010040001",
"label": "偏好低端消费"
},
{
"id": "020020004",
"label": "44岁~59岁"
}
]
},
{
"unionSet": [
{
"id": "030080002",
"label": "偏好开车前1~3天购票"
},
{
"id": "010040002",
"label": "偏好中端消费"
},
{
"id": "020020002",
"label": "10岁~15岁"
}
]
},
{
"unionSet": [
{
"id": "030080001",
"label": "偏好开车当天购"
},
{
"id": "010040003",
"label": "偏好高端消费"
},
{
"id": "020020004",
"label": "44岁~59岁"
}
]
},
{
"unionSet": [
{
"id": "030080002",
"label": "偏好开车前1~3天购票"
},
{
"id": "010040002",
"label": "偏好中端消费"
},
{
"id": "020020003",
"label": "15岁~44岁"
}
]
},
{
"unionSet": [
{
"id": "030080002",
"label": "偏好开车前1~3天购票"
},
{
"id": "010040002",
"label": "偏好中端消费"
},
{
"id": "020020001",
"label": "10岁以下"
}
]
},
{
"unionSet": [
{
"id": "030080001",
"label": "偏好开车当天购"
},
{
"id": "010040001",
"label": "偏好低端消费"
},
{
"id": "020020001",
"label": "10岁以下"
}
]
},
{
"unionSet": [
{
"id": "030080001",
"label": "偏好开车当天购"
},
{
"id": "010040003",
"label": "偏好高端消费"
},
{
"id": "020020001",
"label": "10岁以下"
}
]
},
{
"unionSet": [
{
"id": "030080001",
"label": "偏好开车当天购"
},
{
"id": "010040003",
"label": "偏好高端消费"
},
{
"id": "020020003",
"label": "15岁~44岁"
}
]
},
{
"unionSet": [
{
"id": "030080002",
"label": "偏好开车前1~3天购票"
},
{
"id": "010040002",
"label": "偏好中端消费"
},
{
"id": "020020004",
"label": "44岁~59岁"
}
]
},
{
"unionSet": [
{
"id": "030080001",
"label": "偏好开车当天购"
},
{
"id": "010040003",
"label": "偏好高端消费"
},
{
"id": "020020002",
"label": "10岁~15岁"
}
]
},
{
"unionSet": [
{
"id": "030080003",
"label": "偏好开车前4~7天购票"
},
{
"id": "010040001",
"label": "偏好低端消费"
},
{
"id": "020020002",
"label": "10岁~15岁"
}
]
},
{
"unionSet": [
{
"id": "030080003",
"label": "偏好开车前4~7天购票"
},
{
"id": "010040001",
"label": "偏好低端消费"
},
{
"id": "020020003",
"label": "15岁~44岁"
}
]
},
{
"unionSet": [
{
"id": "030080003",
"label": "偏好开车前4~7天购票"
},
{
"id": "010040001",
"label": "偏好低端消费"
},
{
"id": "020020001",
"label": "10岁以下"
}
]
},
{
"unionSet": [
{
"id": "030080003",
"label": "偏好开车前4~7天购票"
},
{
"id": "010040003",
"label": "偏好高端消费"
},
{
"id": "020020004",
"label": "44岁~59岁"
}
]
},
{
"unionSet": [
{
"id": "030080003",
"label": "偏好开车前4~7天购票"
},
{
"id": "010040003",
"label": "偏好高端消费"
},
{
"id": "020020003",
"label": "15岁~44岁"
}
]
},
{
"unionSet": [
{
"id": "030080003",
"label": "偏好开车前4~7天购票"
},
{
"id": "010040003",
"label": "偏好高端消费"
},
{
"id": "020020002",
"label": "10岁~15岁"
}
]
},
{
"unionSet": [
{
"id": "030080003",
"label": "偏好开车前4~7天购票"
},
{
"id": "010040003",
"label": "偏好高端消费"
},
{
"id": "020020001",
"label": "10岁以下"
}
]
},
{
"unionSet": [
{
"id": "030080003",
"label": "偏好开车前4~7天购票"
},
{
"id": "010040001",
"label": "偏好低端消费"
},
{
"id": "020020004",
"label": "44岁~59岁"
}
]
},
{
"unionSet": [
{
"id": "030080002",
"label": "偏好开车前1~3天购票"
},
{
"id": "010040003",
"label": "偏好高端消费"
},
{
"id": "020020001",
"label": "10岁以下"
}
]
},
{
"unionSet": [
{
"id": "030080002",
"label": "偏好开车前1~3天购票"
},
{
"id": "010040003",
"label": "偏好高端消费"
},
{
"id": "020020002",
"label": "10岁~15岁"
}
]
},
{
"unionSet": [
{
"id": "030080001",
"label": "偏好开车当天购"
},
{
"id": "010040002",
"label": "偏好中端消费"
},
{
"id": "020020002",
"label": "10岁~15岁"
}
]
},
{
"unionSet": [
{
"id": "030080001",
"label": "偏好开车当天购"
},
{
"id": "010040002",
"label": "偏好中端消费"
},
{
"id": "020020001",
"label": "10岁以下"
}
]
},
{
"unionSet": [
{
"id": "030080002",
"label": "偏好开车前1~3天购票"
},
{
"id": "010040003",
"label": "偏好高端消费"
},
{
"id": "020020003",
"label": "15岁~44岁"
}
]
},
{
"unionSet": [
{
"id": "030080001",
"label": "偏好开车当天购"
},
{
"id": "010040002",
"label": "偏好中端消费"
},
{
"id": "020020004",
"label": "44岁~59岁"
}
]
},
{
"unionSet": [
{
"id": "030080002",
"label": "偏好开车前1~3天购票"
},
{
"id": "010040003",
"label": "偏好高端消费"
},
{
"id": "020020004",
"label": "44岁~59岁"
}
]
},
{
"unionSet": [
{
"id": "030080001",
"label": "偏好开车当天购"
},
{
"id": "010040002",
"label": "偏好中端消费"
},
{
"id": "020020003",
"label": "15岁~44岁"
}
]
},
{
"unionSet": [
{
"id": "020010002",
"label": "女"
},
{
"id": "010030003",
"label": "偏好周二到周四出行"
}
]
},
{
"unionSet": [
{
"id": "020010002",
"label": "女"
},
{
"id": "010030002",
"label": "偏好周五出行"
}
]
},
{
"unionSet": [
{
"id": "020010002",
"label": "女"
},
{
"id": "010030001",
"label": "偏好周末出行"
}
]
},
{
"unionSet": [
{
"id": "010020001",
"label": "偏好出发三线以上城市"
},
{
"id": "020020004",
"label": "44岁~59岁"
}
]
},
{
"unionSet": [
{
"id": "010020001",
"label": "偏好出发三线以上城市"
},
{
"id": "020020003",
"label": "15岁~44岁"
}
]
},
{
"unionSet": [
{
"id": "010020002",
"label": "偏好出发二线城市"
},
{
"id": "020020004",
"label": "44岁~59岁"
}
]
},
{
"unionSet": [
{
"id": "010020002",
"label": "偏好出发二线城市"
},
{
"id": "020020003",
"label": "15岁~44岁"
}
]
}
]
原始数据的每一个unionSet是一个条件组,包含一级和二级条件,需要根据这些条件组生成最后的数据。比如这里一共三个条件组,第一个条件组是3个一级条件,一级条件下分别是3个二级条件、2个二级条件、4个二级条件,所以可以组成36个条件,以此类推。一级条件是以pid区分的。
如果答案精彩,可有偿!
回答:
origin就是你的原始数据
origin.reduce((arr, item) => { let res = Object.values(item.unionSet.reduce((o, citem) => {
if(!o[citem.pid]) o[citem.pid] = []
o[citem.pid].push(citem)
return o
}, {})).reduce((list, citem) => {
if(!list.length)return citem.map(_i => ({unionSet: [{id: _i.id, label: _i.name}]}))
return list.reduce((_list, _litem) => {
return _list.concat(citem.map(_i => ({unionSet: [..._litem.unionSet,{id: _i.id, label: _i.name}]})))
}, [])
}, [])
return arr.concat(res)
}, [])
以上是 数据结构转换,如何能方便快捷? 的全部内容, 来源链接: utcz.com/p/944623.html