title | tag | date |
---|---|---|
一道递归练习题 |
递归 |
2019-01-08 |
那天我正工作呢,同事问我一个问题,当场就难住了我。
她说,假如有这样的数据:
const data = [
{
"id": "25",
"title": "电影",
"children": [
{
"id": "136",
"title": "电影院",
"children": [
{
"id": "11111",
"title": "11",
"children": []
},
{
"id": "22222",
"title": "22",
"children": []
},
{
"id": "3333",
"title": "33",
"children": []
},
]
},
{
"id": "33877",
"title": "剧场/剧院",
"children": []
},
{
"id": "33880",
"title": "热门演出",
"children": []
},
{
"id": "25461",
"title": "演出场馆",
"children": []
},
{
"id": "33881",
"title": "赛事展览",
"children": []
},
{
"id": "33882",
"title": "其他电影演出赛事",
"children": []
}
]
},
{
"id": "2926",
"title": "展馆展览",
"children": [
{
"id": "2903",
"title": "科学博物",
"children": null
},
{
"id": "2904",
"title": "展览演艺",
"children": null
},
{
"id": "25465",
"title": "美术馆",
"children": null
},
{
"id": "25463",
"title": "博物馆",
"children": null
}
]
}
]
然后呢,需要找出 ["25_136", "25_136_11111", "2926_2903"]
对应的映射
如:["电影_电影院", "电影_电影院_11", "展馆展览_科学博物"]
我当时就表示不太懂,回家看一下。
我没有做过同事的那个项目,单单基于该问题。
["25_136", "25_136_11111", "2926_2903"]
["电影_电影院", "电影_电影院_11", "展馆展览_科学博物"]
我想的是,把多层结构的数据给扁平化。将 data 的值变成:
{
25: "电影",
25_136: "电影_电影院",
25_136_11111: "电影_电影院_11"
}
这样在传入 key 的时候,能轻易的给出其 value。
const target = ["25_136", "25_136_11111", "2926_2903"]
/**
* @params dataItem
* @params pre 数据前缀,如若不是第一层的数据,则需带上 pre。
*/
const dataParse = (dataItem, pre) => {
let temp = []
if (pre) {
temp.push({
[`${pre.id}_${dataItem.id}`]: `${pre.title}_${dataItem.title}`
})
} else {
temp.push({
[dataItem.id]: dataItem.title
})
}
if (dataItem.children && dataItem.children.length > 0) {
dataItem.children.forEach(item => {
if (pre) {
temp.push(...dataParse(item, {
title: `${pre.title}_${dataItem.title}`,
id: `${pre.id}_${dataItem.id}`
}))
} else {
temp.push(...dataParse(item, {
title: dataItem.title,
id: dataItem.id
}))
}
})
}
return temp
}
// 递归生成扁平化数据
let tempData = {};
// 第一层循环获得 key: value 的对象
data.forEach(item => {
// 第二层循环将对象们合并
dataParse(item).forEach(it => {
tempData= {
...tempData,
...it,
};
});
});
console.log(tempData);
target.forEach(item => {
console.log(tempData[item]);
});
其实还有常规的做法,就是把输入拆分,遍历查找。这里我就不写了。
大吉大利,今晚吃鸡。