数据结构转换,如何能方便快捷?

在工作有一个场景,如下图

我们在处理数据时认为每个一级条件下的二级条件是或的关系,每个一级条件间是且的关系,具体数据组织形式为测试数据中的原数据,但是条件筛选服务器接收的参数在同一个筛选条件下只有且的关系,不同的筛选条件间是或的关系,因此需要将原数据转换为输出数据的形式,以上图为例,三种筛选条件下的7个子条件重新排列组合后生成12个筛选条件,
即:

  1. 偏好开车当天购票 且 为男性 且 偏好低端消费。
  2. 偏好开车当天购票 且 为男性 且 偏好高端消费。
  3. 偏好开车前4-7天购票 且 为男性 且 偏好低端消费。
  4. 偏好开车前4-7购票 且 为男性 且 偏好高端消费。
  5. 偏好开车前1-3天购票 且 为男性 且 偏好低端消费。
  6. 偏好开车前1-3天购票 且 为男性 且 偏好高端消费。
  7. 偏好开车当天购票 且 为女性 且 偏好低端消费。
  8. 偏好开车当天购票 且 为女性 且 偏好高端消费。
  9. 偏好开车前4-7天购票 且 为女性 且 偏好低端消费。
  10. 偏好开车前4-7购票 且 为女性 且 偏好高端消费。
  11. 偏好开车前1-3天购票 且 为女性 且 偏好低端消费。
  12. 偏好开车前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

回到顶部