123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- import REGION_DATA from "china-area-data";
- import { cloneDeep } from "lodash-unified";
- interface ProvinceData {
- value: string;
- label: string;
- children?: Array<ProvinceData>;
- }
- // code转汉字大对象,例:CodeToText['110000']输出北京市
- const CodeToText = {};
- // 汉字转code大对象,例:TextToCode['北京市']['市辖区']['朝阳区'].code输出110105
- const TextToCode = {};
- // 省份对象
- const provinceObject = REGION_DATA["86"];
- // 省市区三级联动数据(不带“全部”选项)
- const regionData = [];
- // 省市二级联动数据(不带“全部”选项)
- let provinceAndCityData = [];
- const ALL_TEXT = "全部";
- CodeToText[""] = ALL_TEXT;
- // 计算省
- Object.keys(provinceObject).forEach(prop => {
- const provinceText = provinceObject[prop];
- regionData.push({
- value: prop, // 省份code值
- label: provinceText // 省份汉字
- });
- CodeToText[prop] = provinceText;
- TextToCode[provinceText] = {
- code: prop
- };
- TextToCode[provinceText][ALL_TEXT] = {
- code: ""
- };
- });
- // 计算市
- regionData.forEach((item: ProvinceData) => {
- const provinceCode = item.value;
- const provinceText = item.label;
- const provinceChildren = [];
- const provinceData = REGION_DATA[provinceCode] ?? {};
- Object.keys(provinceData).forEach(prop => {
- provinceChildren.push({
- value: prop,
- label: provinceData[prop]
- });
- CodeToText[prop] = provinceData[prop];
- TextToCode[provinceText][provinceData[prop]] = {
- code: prop
- };
- TextToCode[provinceText][provinceData[prop]][ALL_TEXT] = {
- code: ""
- };
- });
- if (provinceChildren.length) {
- item.children = provinceChildren;
- }
- });
- provinceAndCityData = cloneDeep(regionData);
- // 计算区
- regionData.forEach((item: ProvinceData) => {
- const province = item.children;
- const provinceText = item.label;
- if (province) {
- province.forEach(pItem => {
- const cityCode = pItem.value;
- const cityText = pItem.label;
- const cityChildren = [];
- const cityData = REGION_DATA[cityCode] ?? {};
- Object.keys(cityData).forEach(prop => {
- cityChildren.push({
- value: prop,
- label: cityData[prop]
- });
- CodeToText[prop] = cityData[prop];
- TextToCode[provinceText][cityText][cityData[prop]] = {
- code: prop
- };
- });
- if (cityChildren.length) {
- pItem.children = cityChildren;
- }
- });
- }
- });
- // 添加“全部”选项
- const provinceAndCityDataPlus = cloneDeep(provinceAndCityData);
- provinceAndCityDataPlus.unshift({
- value: "",
- label: ALL_TEXT
- });
- provinceAndCityDataPlus.forEach((item: ProvinceData) => {
- const province = item.children;
- if (province?.length) {
- province.unshift({
- value: "",
- label: ALL_TEXT
- });
- province.forEach(pItem => {
- const city = pItem.children;
- if (city?.length) {
- city.unshift({
- value: "",
- label: ALL_TEXT
- });
- }
- });
- }
- });
- const regionDataPlus = cloneDeep(regionData);
- regionDataPlus.unshift({
- value: "",
- label: ALL_TEXT
- });
- regionDataPlus.forEach((item: ProvinceData) => {
- const province = item.children;
- if (province?.length) {
- province.unshift({
- value: "",
- label: ALL_TEXT
- });
- province.forEach(pItem => {
- const city = pItem.children;
- if (city?.length) {
- city.unshift({
- value: "",
- label: ALL_TEXT
- });
- }
- });
- }
- });
- /**
- * 汉字转区域码
- * @param provinceText 省
- * @param cityText 市
- * @param regionText 区
- * @returns
- */
- function convertTextToCode(
- provinceText: string,
- cityText: string,
- regionText?: string
- ): string {
- let code = "";
- if (provinceText && TextToCode[provinceText]) {
- const province = TextToCode[provinceText];
- code = province.code;
- if (cityText && province[cityText]) {
- const city = province[cityText];
- code = `${code}${cityText === ALL_TEXT ? "" : ", "}${city.code}`;
- if (regionText && city[regionText]) {
- code = `${code}${regionText === ALL_TEXT ? "" : ", "}${
- city[regionText].code
- }`;
- }
- }
- }
- return code;
- }
- export {
- provinceAndCityData,
- regionData,
- provinceAndCityDataPlus,
- regionDataPlus,
- CodeToText,
- TextToCode,
- convertTextToCode
- };
|