fmt.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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)
  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) {
  29. const r = {}
  30. const rC = _.cloneDeep(provinces)
  31. // 过滤没有太大用处的二级名称
  32. const f = ['县', '省直辖县级行政区划', '自治区直辖县级行政区划']
  33. _.forEach(rC, p => {
  34. p.childs = _.map(
  35. _.filter(_.cloneDeep(cities), c => p.code === c.parent_code && _.every(f, n => c.name !== n)),
  36. c => delete c.parent_code && c
  37. )
  38. // 四个直辖市(北京、天津、上海、重庆)仅有一个二级(城市)名为市辖区,
  39. // 出于实用性考虑,将二级(城市)重命名为第一级(省份)名称
  40. if (p.childs.length === 1 && p.childs[0].name === '市辖区') p.childs[0].name = p.name
  41. r[p.name] = p.childs.map(c => c.name)
  42. })
  43. return [r, rC]
  44. }
  45. /**
  46. * 获取省市区三级联动数据
  47. * @Author https://github.com/modood
  48. * @DateTime 2017-09-18 15:27
  49. */
  50. function getAddressPCA (provinces, cities, areas, streets) {
  51. const r = {}
  52. const rC = _.cloneDeep(provinces)
  53. // 特殊城市处理,中山市、东莞市、儋州市和嘉峪关市没有第三级(区县),
  54. // 嘉峪关市有第三级,但是有且只有一个(市辖区:620201),
  55. // 出于实用性考虑,使用第四级(乡镇街道)补进
  56. const f = ['441900', '442000', '460400', '620200']
  57. _.forEach(rC, p => {
  58. r[p.name] = {}
  59. p.childs = _.map(
  60. _.filter(_.cloneDeep(cities), c => p.code === c.parent_code),
  61. c => delete c.parent_code && c
  62. )
  63. _.forEach(p.childs, c => {
  64. const it = _.includes(f, c.code) ? _.cloneDeep(streets) : _.cloneDeep(areas)
  65. c.childs = _.map(
  66. // 嘉峪关市比较特殊,二级(嘉峪关市:620200)三级只有一个(市辖区:620201),
  67. // 因此用第四级数据补进第三级的话,需要处理一下
  68. _.filter(it, i => (c.code === '620200' ? '620201' : c.code) === i.parent_code),
  69. i => delete i.parent_code && i
  70. )
  71. r[p.name][c.name] = _.map(c.childs, i => i.name)
  72. })
  73. })
  74. return [r, rC]
  75. }
  76. /**
  77. * 获取省市区镇四级联动数据
  78. * @Author https://github.com/modood
  79. * @DateTime 2017-09-18 17:28
  80. */
  81. function getAddressPCAS (provinces, cities, areas, streets) {
  82. const r = {}
  83. const rC = _.cloneDeep(provinces)
  84. _.forEach(rC, p => {
  85. r[p.name] = {}
  86. p.childs = _.map(
  87. _.filter(_.cloneDeep(cities), c => p.code === c.parent_code),
  88. c => delete c.parent_code && c
  89. )
  90. _.forEach(p.childs, c => {
  91. r[p.name][c.name] = {}
  92. c.childs = _.map(
  93. _.filter(_.cloneDeep(areas), a => c.code === a.parent_code),
  94. a => delete a.parent_code && a
  95. )
  96. _.forEach(c.childs, a => {
  97. // 特殊区县单独处理,福建省泉州市金门县没有第四级(乡镇),
  98. // 出于实用性考虑,使用一个第三级(区县)替代
  99. if (a.code === '350527') {
  100. a.childs = [{ name: '金门县', code: '350527000000' }]
  101. r[p.name][c.name][a.name] = ['金门县']
  102. return
  103. }
  104. a.childs = _.map(
  105. _.filter(_.cloneDeep(streets), s => a.code === s.parent_code),
  106. // 第四级(街道)数据过滤掉“办事处”后缀
  107. s => delete s.parent_code && (s.name = s.name.replace('办事处', '')) && s
  108. )
  109. r[p.name][c.name][a.name] = _.map(a.childs, s => s.name)
  110. })
  111. })
  112. })
  113. return [r, rC]
  114. }