Skip to content

Latest commit

 

History

History
194 lines (166 loc) · 3.78 KB

递归练习.md

File metadata and controls

194 lines (166 loc) · 3.78 KB
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]);
});

其实还有常规的做法,就是把输入拆分,遍历查找。这里我就不写了。

大吉大利,今晚吃鸡。