chinaArea.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. import REGION_DATA from "china-area-data";
  2. import { cloneDeep } from "lodash-unified";
  3. interface ProvinceData {
  4. value: string;
  5. label: string;
  6. children?: Array<ProvinceData>;
  7. }
  8. // code转汉字大对象,例:CodeToText['110000']输出北京市
  9. const CodeToText = {};
  10. // 汉字转code大对象,例:TextToCode['北京市']['市辖区']['朝阳区'].code输出110105
  11. const TextToCode = {};
  12. // 省份对象
  13. const provinceObject = REGION_DATA["86"];
  14. // 省市区三级联动数据(不带“全部”选项)
  15. const regionData = [];
  16. // 省市二级联动数据(不带“全部”选项)
  17. let provinceAndCityData = [];
  18. const ALL_TEXT = "全部";
  19. CodeToText[""] = ALL_TEXT;
  20. // 计算省
  21. Object.keys(provinceObject).forEach(prop => {
  22. const provinceText = provinceObject[prop];
  23. regionData.push({
  24. value: prop, // 省份code值
  25. label: provinceText // 省份汉字
  26. });
  27. CodeToText[prop] = provinceText;
  28. TextToCode[provinceText] = {
  29. code: prop
  30. };
  31. TextToCode[provinceText][ALL_TEXT] = {
  32. code: ""
  33. };
  34. });
  35. // 计算市
  36. regionData.forEach((item: ProvinceData) => {
  37. const provinceCode = item.value;
  38. const provinceText = item.label;
  39. const provinceChildren = [];
  40. const provinceData = REGION_DATA[provinceCode] ?? {};
  41. Object.keys(provinceData).forEach(prop => {
  42. provinceChildren.push({
  43. value: prop,
  44. label: provinceData[prop]
  45. });
  46. CodeToText[prop] = provinceData[prop];
  47. TextToCode[provinceText][provinceData[prop]] = {
  48. code: prop
  49. };
  50. TextToCode[provinceText][provinceData[prop]][ALL_TEXT] = {
  51. code: ""
  52. };
  53. });
  54. if (provinceChildren.length) {
  55. item.children = provinceChildren;
  56. }
  57. });
  58. provinceAndCityData = cloneDeep(regionData);
  59. // 计算区
  60. regionData.forEach((item: ProvinceData) => {
  61. const province = item.children;
  62. const provinceText = item.label;
  63. if (province) {
  64. province.forEach(pItem => {
  65. const cityCode = pItem.value;
  66. const cityText = pItem.label;
  67. const cityChildren = [];
  68. const cityData = REGION_DATA[cityCode] ?? {};
  69. Object.keys(cityData).forEach(prop => {
  70. cityChildren.push({
  71. value: prop,
  72. label: cityData[prop]
  73. });
  74. CodeToText[prop] = cityData[prop];
  75. TextToCode[provinceText][cityText][cityData[prop]] = {
  76. code: prop
  77. };
  78. });
  79. if (cityChildren.length) {
  80. pItem.children = cityChildren;
  81. }
  82. });
  83. }
  84. });
  85. // 添加“全部”选项
  86. const provinceAndCityDataPlus = cloneDeep(provinceAndCityData);
  87. provinceAndCityDataPlus.unshift({
  88. value: "",
  89. label: ALL_TEXT
  90. });
  91. provinceAndCityDataPlus.forEach((item: ProvinceData) => {
  92. const province = item.children;
  93. if (province?.length) {
  94. province.unshift({
  95. value: "",
  96. label: ALL_TEXT
  97. });
  98. province.forEach(pItem => {
  99. const city = pItem.children;
  100. if (city?.length) {
  101. city.unshift({
  102. value: "",
  103. label: ALL_TEXT
  104. });
  105. }
  106. });
  107. }
  108. });
  109. const regionDataPlus = cloneDeep(regionData);
  110. regionDataPlus.unshift({
  111. value: "",
  112. label: ALL_TEXT
  113. });
  114. regionDataPlus.forEach((item: ProvinceData) => {
  115. const province = item.children;
  116. if (province?.length) {
  117. province.unshift({
  118. value: "",
  119. label: ALL_TEXT
  120. });
  121. province.forEach(pItem => {
  122. const city = pItem.children;
  123. if (city?.length) {
  124. city.unshift({
  125. value: "",
  126. label: ALL_TEXT
  127. });
  128. }
  129. });
  130. }
  131. });
  132. /**
  133. * 汉字转区域码
  134. * @param provinceText 省
  135. * @param cityText 市
  136. * @param regionText 区
  137. * @returns
  138. */
  139. function convertTextToCode(
  140. provinceText: string,
  141. cityText: string,
  142. regionText?: string
  143. ): string {
  144. let code = "";
  145. if (provinceText && TextToCode[provinceText]) {
  146. const province = TextToCode[provinceText];
  147. code = province.code;
  148. if (cityText && province[cityText]) {
  149. const city = province[cityText];
  150. code = `${code}${cityText === ALL_TEXT ? "" : ", "}${city.code}`;
  151. if (regionText && city[regionText]) {
  152. code = `${code}${regionText === ALL_TEXT ? "" : ", "}${
  153. city[regionText].code
  154. }`;
  155. }
  156. }
  157. }
  158. return code;
  159. }
  160. export {
  161. provinceAndCityData,
  162. regionData,
  163. provinceAndCityDataPlus,
  164. regionDataPlus,
  165. CodeToText,
  166. TextToCode,
  167. convertTextToCode
  168. };