fmt.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. const path = require('path')
  2. const _ = require('lodash')
  3. const out = require('./out')
  4. const provinces = require(path.resolve(__dirname, '../dist/provinces.json'))
  5. const cities = require(path.resolve(__dirname, '../dist/cities.json'))
  6. const areas = require(path.resolve(__dirname, '../dist/areas.json'))
  7. const streets = require(path.resolve(__dirname, '../dist/streets.json'))
  8. ;(function () {
  9. console.log('[1/4] 正在导出 “省份、城市” 二级联动数据...')
  10. const [pc, pcC] = getAddressPC(provinces, cities, areas)
  11. out('pc', pc)
  12. out('pc-code', pcC)
  13. console.log('[2/4] 正在导出 “省份、城市、区县” 三级联动数据...')
  14. const [pca, pcaC] = getAddressPCA(provinces, cities, areas, streets)
  15. out('pca', pca)
  16. out('pca-code', pcaC)
  17. console.log('[3/4] 正在导出 “省份、城市、区县、乡镇” 四级联动数据...该步骤操作数据较多,比较耗时,请耐心等候...')
  18. const [pcas, pcasC] = getAddressPCAS(provinces, cities, areas, streets)
  19. out('pcas', pcas)
  20. out('pcas-code', pcasC)
  21. console.log('[4/4] 数据更新完成!')
  22. })()
  23. /**
  24. * 获取省市二级联动数据
  25. * @Author https://github.com/modood
  26. * @DateTime 2017-09-18 15:14
  27. */
  28. function getAddressPC (provinces, cities, areas) {
  29. const r = {}
  30. const rC = _.cloneDeep(provinces)
  31. // 过滤没有太大用处的二级名称
  32. const f = ['县', '省直辖县级行政区划', '自治区直辖县级行政区划']
  33. _.forEach(rC, p => {
  34. let ac = []
  35. p.childs = _.map(
  36. _.filter(_.cloneDeep(cities), c => {
  37. // 出于实用性考虑,将省或自治区直辖区县数据视为第二级(城市)数据
  38. if (p.code === c.parent_code && ['省直辖县级行政区划', '自治区直辖县级行政区划'].includes(c.name)) {
  39. ac = _.map(_.filter(_.cloneDeep(areas), a => c.code === a.parent_code), a => delete a.parent_code && a)
  40. }
  41. return p.code === c.parent_code && _.every(f, n => c.name !== n)
  42. }),
  43. c => delete c.parent_code && c
  44. )
  45. p.childs.push(...ac)
  46. // 四个直辖市(北京、天津、上海、重庆)仅有一个二级(城市)名为市辖区,
  47. // 出于实用性考虑,将二级(城市)重命名为第一级(省份)名称
  48. if (p.childs.length === 1 && p.childs[0].name === '市辖区') p.childs[0].name = p.name
  49. r[p.name] = p.childs.map(c => c.name)
  50. })
  51. return [r, rC]
  52. }
  53. /**
  54. * 获取省市区三级联动数据
  55. * @Author https://github.com/modood
  56. * @DateTime 2017-09-18 15:27
  57. */
  58. function getAddressPCA (provinces, cities, areas, streets) {
  59. const r = {}
  60. const rC = _.cloneDeep(provinces)
  61. // 特殊城市处理,中山市、东莞市、儋州市和嘉峪关市没有第三级(区县),
  62. // 嘉峪关市有第三级,但是有且只有一个(市辖区:620201),
  63. // 出于实用性考虑,使用第四级(乡镇街道)补进
  64. const f = ['4419', '4420', '4604', '6202']
  65. _.forEach(rC, p => {
  66. r[p.name] = {}
  67. p.childs = _.map(
  68. _.filter(_.cloneDeep(cities), c => p.code === c.parent_code),
  69. c => delete c.parent_code && c
  70. )
  71. _.forEach(p.childs, c => {
  72. let it
  73. if (_.includes(f, c.code)) {
  74. // 嘉峪关市比较特殊,二级(嘉峪关市:6202)三级只有一个(市辖区:620201),
  75. // 因此用第四级数据补进第三级的话,需要处理一下
  76. c.code = c.code === '6202' ? '620201' : `${c.code}00`
  77. it = _.cloneDeep(streets)
  78. } else {
  79. it = _.cloneDeep(areas)
  80. }
  81. c.childs = _.map(
  82. _.filter(it, i => c.code === i.parent_code),
  83. i => delete i.parent_code && i
  84. )
  85. r[p.name][c.name] = _.map(c.childs, i => i.name)
  86. })
  87. })
  88. return [r, rC]
  89. }
  90. /**
  91. * 获取省市区镇四级联动数据
  92. * @Author https://github.com/modood
  93. * @DateTime 2017-09-18 17:28
  94. */
  95. function getAddressPCAS (provinces, cities, areas, streets) {
  96. const r = {}
  97. const rC = _.cloneDeep(provinces)
  98. _.forEach(rC, p => {
  99. r[p.name] = {}
  100. p.childs = _.map(
  101. _.filter(_.cloneDeep(cities), c => p.code === c.parent_code),
  102. c => delete c.parent_code && c
  103. )
  104. _.forEach(p.childs, c => {
  105. r[p.name][c.name] = {}
  106. c.childs = _.map(
  107. _.filter(_.cloneDeep(areas), a => c.code === a.parent_code),
  108. a => delete a.parent_code && a
  109. )
  110. _.forEach(c.childs, a => {
  111. // 特殊区县单独处理,福建省泉州市金门县没有第四级(乡镇),
  112. // 出于实用性考虑,使用一个第三级(区县)替代
  113. if (a.code === '350527') {
  114. a.childs = [{ name: '金门县', code: '350527000' }]
  115. r[p.name][c.name][a.name] = ['金门县']
  116. return
  117. }
  118. a.childs = _.map(
  119. _.filter(_.cloneDeep(streets), s => a.code === s.parent_code),
  120. // 第四级(街道)数据过滤掉“办事处”后缀
  121. s => delete s.parent_code && (s.name = s.name.replace('办事处', '')) && s
  122. )
  123. r[p.name][c.name][a.name] = _.map(a.childs, s => s.name)
  124. })
  125. })
  126. })
  127. return [r, rC]
  128. }