parse-area.js 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812
  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
  6. var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
  7. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /**
  8. * address-parse
  9. * MIT License
  10. * By www.asseek.com
  11. */
  12. var _area = require('../area');
  13. var _area2 = _interopRequireDefault(_area);
  14. var _utils = require('./utils');
  15. var _utils2 = _interopRequireDefault(_utils);
  16. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  17. function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
  18. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  19. var ProvinceKeys = ['特别行政区', '古自治区', '维吾尔自治区', '壮族自治区', '回族自治区', '自治区', '省省直辖', '省', '市'];
  20. var CityKeys = ['布依族苗族自治州', '苗族侗族自治州', '藏族羌族自治州', '哈尼族彝族自治州', '壮族苗族自治州', '傣族景颇族自治州', '蒙古族藏族自治州', '傣族自治州', '白族自治州', '藏族自治州', '彝族自治州', '回族自治州', '蒙古自治州', '朝鲜族自治州', '地区', '哈萨克自治州', '盟', '市'];
  21. var AreaKeys = ['满族自治县', '满族蒙古族自治县', '蒙古族自治县', '朝鲜族自治县', '回族彝族自治县', '彝族回族苗族自治县', '彝族苗族自治县', '土家族苗族自治县', '布依族苗族自治县', '苗族布依族自治县', '苗族土家族自治县', '彝族傣族自治县', '傣族彝族自治县', '仡佬族苗族自治县', '黎族苗族自治县', '苗族侗族自治县', '哈尼族彝族傣族自治县', '哈尼族彝族自治县', '彝族哈尼族拉祜族自治县', '傣族拉祜族佤族自治县', '傣族佤族自治县', '拉祜族佤族布朗族傣族自治县', '苗族瑶族傣族自治县', '彝族回族自治县', '独龙族怒族自治县', '保安族东乡族撒拉族自治县', '回族土族自治县', '撒拉族自治县', '哈萨克自治县', '塔吉克自治县', '回族自治县', '畲族自治县', '土家族自治县', '布依族自治县', '苗族自治县', '瑶族自治县', '侗族自治县', '水族自治县', '傈僳族自治县', '仫佬族自治县', '毛南族自治县', '黎族自治县', '羌族自治县', '彝族自治县', '藏族自治县', '纳西族自治县', '裕固族自治县', '哈萨克族自治县', '哈尼族自治县', '拉祜族自治县', '佤族自治县', '达斡尔族区', '达斡尔族自治旗', '左旗', '右旗', '中旗', '后旗', '联合旗', '自治旗', '旗', '自治县', '街道办事处', '新区', '区', '县', '市'];
  22. var ParseArea = function () {
  23. _createClass(ParseArea, null, [{
  24. key: 'init',
  25. value: function init() {
  26. for (var code in _area2.default.province_list) {
  27. var province = _area2.default.province_list[code];
  28. ParseArea.ProvinceShort[code] = ProvinceKeys.reduce(function (v, key) {
  29. return v.replace(key, '');
  30. }, province);
  31. ParseArea.ProvinceShortList.push(ParseArea.ProvinceShort[code]);
  32. }
  33. for (var _code in _area2.default.city_list) {
  34. var city = _area2.default.city_list[_code];
  35. if (city.length > 2) {
  36. ParseArea.CityShort[_code] = CityKeys.reduce(function (v, key) {
  37. return v.replace(key, '');
  38. }, city);
  39. }
  40. }
  41. for (var _code2 in _area2.default.area_list) {
  42. var area = _area2.default.area_list[_code2];
  43. if (area === '雨花台区') area = '雨花区';
  44. if (area === '神农架林区') area = '神农架';
  45. if (area.length > 2 && area !== '高新区') {
  46. ParseArea.AreaShort[_code2] = AreaKeys.reduce(function (v, key) {
  47. if (v.indexOf(key) > 1) v = v.replace(key, '');
  48. return v;
  49. }, area);
  50. }
  51. }
  52. ParseArea.isInit = true;
  53. }
  54. }]);
  55. function ParseArea(address) {
  56. _classCallCheck(this, ParseArea);
  57. if (!ParseArea.isInit) {
  58. ParseArea.init();
  59. }
  60. if (address) {
  61. return this.parse(address);
  62. }
  63. }
  64. /**
  65. * 开始解析
  66. * @param address string
  67. * @param parseAll 是否执行全部解析 默认识别到city终止
  68. * @returns {Array}
  69. */
  70. _createClass(ParseArea, [{
  71. key: 'parse',
  72. value: function parse(address, parseAll) {
  73. var _results;
  74. this.results = [];
  75. // 正向解析
  76. (_results = this.results).unshift.apply(_results, _toConsumableArray(ParseArea.parseByProvince(address)));
  77. if (parseAll || !this.results[0] || !this.results[0].__parse) {
  78. var _results2;
  79. // 逆向城市解析 通过所有CityShort匹配
  80. (_results2 = this.results).unshift.apply(_results2, _toConsumableArray(ParseArea.parseByCity(address)));
  81. if (parseAll || !this.results[0] || !this.results[0].__parse) {
  82. var _results3;
  83. // 逆向地区解析 通过所有AreaShort匹配
  84. (_results3 = this.results).unshift.apply(_results3, _toConsumableArray(ParseArea.parseByArea(address)));
  85. }
  86. }
  87. // __parse结果改为数值类型
  88. if (this.results.length > 1) {
  89. var _iteratorNormalCompletion = true;
  90. var _didIteratorError = false;
  91. var _iteratorError = undefined;
  92. try {
  93. for (var _iterator = this.results[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
  94. var result = _step.value;
  95. var _address = address;
  96. result.__parse = +result.__parse;
  97. if (result.__parse && result.province && _address.includes(result.province)) {
  98. _address = _address.replace(result.province, '');
  99. result.__parse += 1;
  100. if (result.city) {
  101. if (_address.includes(result.city)) {
  102. if (result.city !== '县' || !_address.indexOf(result.city)) {
  103. _address = _address.replace(result.city, '');
  104. }
  105. result.__parse += 1;
  106. if (result.area && _address.includes(result.area)) {
  107. result.__parse += 1;
  108. }
  109. } else if (address.includes(result.city)) {
  110. result.__parse += 0.5;
  111. if (result.area && _address.includes(result.area)) {
  112. result.__parse += 1;
  113. }
  114. }
  115. if (result.area && _address.includes(result.area)) {
  116. result.__parse += 1;
  117. } else if (result.area && _address.includes(result.area.substr(0, 2))) {
  118. result.__parse += 0.5;
  119. }
  120. }
  121. }
  122. }
  123. } catch (err) {
  124. _didIteratorError = true;
  125. _iteratorError = err;
  126. } finally {
  127. try {
  128. if (!_iteratorNormalCompletion && _iterator.return) {
  129. _iterator.return();
  130. }
  131. } finally {
  132. if (_didIteratorError) {
  133. throw _iteratorError;
  134. }
  135. }
  136. }
  137. }
  138. // 可信度排序
  139. this.results.sort(function (a, b) {
  140. return !a.__parse && !b.__parse && a.city && !b.city ? -1 : !a.__parse && !b.__parse && !a.city && b.city ? 1 : a.__parse && !b.__parse ? -1 : !a.__parse && b.__parse ? 1 : a.__parse && b.__parse && a.__parse > b.__parse ? -1 : a.__parse && b.__parse && a.__parse < b.__parse ? 1 : a.__parse && a.__type === 'parseByProvince' ? -1 : b.__parse && b.__type === 'parseByProvince' ? 1 : a.name.length > b.name.length ? 1 : a.name.length < b.name.length ? -1 : 0;
  141. });
  142. return this.results;
  143. }
  144. /**
  145. * 1.1 提取省份
  146. */
  147. }], [{
  148. key: 'parseByProvince',
  149. value: function parseByProvince(addressBase) {
  150. var province_list = _area2.default.province_list;
  151. var results = [];
  152. var result = {
  153. province: '',
  154. city: '',
  155. area: '',
  156. details: '',
  157. name: '',
  158. code: '',
  159. __type: 'parseByProvince',
  160. __parse: false
  161. };
  162. var address = addressBase;
  163. for (var code in province_list) {
  164. var province = province_list[code];
  165. var index = address.indexOf(province);
  166. var shortProvince = index > -1 ? '' : ParseArea.ProvinceShort[code];
  167. var provinceLength = shortProvince ? shortProvince.length : province.length;
  168. if (shortProvince) {
  169. index = address.indexOf(shortProvince);
  170. }
  171. if (index > -1) {
  172. // 如果省份不是第一位 在省份之前的字段识别为名称
  173. if (index > 0) {
  174. result.name = address.substr(0, index).trim();
  175. address = address.substr(index).trim();
  176. }
  177. result.province = province;
  178. result.code = code;
  179. var _address = address.substr(provinceLength);
  180. if (_address.charAt(0) !== '市' || _address.indexOf(province) > -1) {
  181. address = _address;
  182. }
  183. //如果是用短名匹配的 要替换省关键字
  184. if (shortProvince) {
  185. var _iteratorNormalCompletion2 = true;
  186. var _didIteratorError2 = false;
  187. var _iteratorError2 = undefined;
  188. try {
  189. for (var _iterator2 = ProvinceKeys[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
  190. var key = _step2.value;
  191. if (address.indexOf(ProvinceKeys[key]) === 0) {
  192. address = address.substr(ProvinceKeys[key].length);
  193. }
  194. }
  195. } catch (err) {
  196. _didIteratorError2 = true;
  197. _iteratorError2 = err;
  198. } finally {
  199. try {
  200. if (!_iteratorNormalCompletion2 && _iterator2.return) {
  201. _iterator2.return();
  202. }
  203. } finally {
  204. if (_didIteratorError2) {
  205. throw _iteratorError2;
  206. }
  207. }
  208. }
  209. }
  210. var __address = ParseArea.parse_city_by_province(address, result);
  211. if (!result.city) {
  212. __address = ParseArea.parse_area_by_province(address, result);
  213. }
  214. if (result.city) {
  215. result.__parse = true;
  216. address = __address;
  217. // 因为详细地址内包含其他地区数据导致解析失败的解决方案
  218. // 为避免边界问题 含省份名才触发,如果是伊宁市上海城徐汇苑不触发
  219. if (index > 4 && ParseArea.ProvinceShortList.some(function (shortProvince) {
  220. return result.name.includes(shortProvince);
  221. })) {
  222. var _ParseArea$parseByPro = ParseArea.parseByProvince(result.name),
  223. _ParseArea$parseByPro2 = _slicedToArray(_ParseArea$parseByPro, 1),
  224. _result = _ParseArea$parseByPro2[0];
  225. if (_result.__parse) {
  226. Object.assign(result, _result);
  227. address = addressBase.substr(index).trim();
  228. if (!result.area) {
  229. address = ParseArea.parse_area_by_city(address, result);
  230. }
  231. result.__parse = 3;
  232. }
  233. }
  234. break;
  235. } else {
  236. //如果没有识别到地区 缓存本次结果,并重置数据
  237. results.unshift(_extends({}, result, { details: address.trim() }));
  238. result.province = '';
  239. result.code = '';
  240. result.name = '';
  241. address = addressBase;
  242. }
  243. }
  244. }
  245. if (result.code) {
  246. results.unshift(_extends({}, result, { details: address.trim() }));
  247. }
  248. return results;
  249. }
  250. /**
  251. * 1.2.提取城市
  252. * @returns {boolean}
  253. */
  254. }, {
  255. key: 'parse_city_by_province',
  256. value: function parse_city_by_province(address, result) {
  257. var cityList = _utils2.default.getTargetAreaListByCode('city', result.code);
  258. var _result = {
  259. city: '',
  260. code: '',
  261. index: -1,
  262. address: '',
  263. isShort: false
  264. };
  265. var _iteratorNormalCompletion3 = true;
  266. var _didIteratorError3 = false;
  267. var _iteratorError3 = undefined;
  268. try {
  269. for (var _iterator3 = cityList[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
  270. var city = _step3.value;
  271. var index = address.indexOf(city.name);
  272. var shortCity = index > -1 ? '' : ParseArea.CityShort[city.code];
  273. var cityLength = shortCity ? shortCity.length : city.name.length;
  274. if (shortCity) {
  275. index = address.indexOf(shortCity);
  276. }
  277. if (index > -1 && (_result.index === -1 || _result.index > index || !shortCity && _result.isShort)) {
  278. _result.city = city.name;
  279. _result.code = city.code;
  280. _result.index = index;
  281. _result.address = address.substr(index + cityLength);
  282. _result.isShort = !!shortCity;
  283. //如果是用短名匹配的 要替换市关键字
  284. if (shortCity) {
  285. var _iteratorNormalCompletion4 = true;
  286. var _didIteratorError4 = false;
  287. var _iteratorError4 = undefined;
  288. try {
  289. for (var _iterator4 = CityKeys[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
  290. var key = _step4.value;
  291. if (address.indexOf(key) === 0) {
  292. //排除几个会导致异常的解析
  293. if (key !== '市' && !['市北区', '市南区', '市中区', '市辖区'].some(function (v) {
  294. return address.indexOf(v) === 0;
  295. })) {
  296. address = address.substr(key.length);
  297. }
  298. }
  299. }
  300. } catch (err) {
  301. _didIteratorError4 = true;
  302. _iteratorError4 = err;
  303. } finally {
  304. try {
  305. if (!_iteratorNormalCompletion4 && _iterator4.return) {
  306. _iterator4.return();
  307. }
  308. } finally {
  309. if (_didIteratorError4) {
  310. throw _iteratorError4;
  311. }
  312. }
  313. }
  314. }
  315. }
  316. if (index > -1 && index < 3) {
  317. result.city = city.name;
  318. result.code = city.code;
  319. _result.address = address.substr(index + cityLength);
  320. //如果是用短名匹配的 要替换市关键字
  321. if (shortCity) {
  322. var _iteratorNormalCompletion5 = true;
  323. var _didIteratorError5 = false;
  324. var _iteratorError5 = undefined;
  325. try {
  326. for (var _iterator5 = CityKeys[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
  327. var _key = _step5.value;
  328. if (_result.address.indexOf(_key) === 0) {
  329. //排除几个会导致异常的解析
  330. if (_key !== '市' && !['市北区', '市南区', '市中区', '市辖区'].some(function (v) {
  331. return _result.address.indexOf(v) === 0;
  332. })) {
  333. _result.address = _result.address.substr(_key.length);
  334. }
  335. }
  336. }
  337. } catch (err) {
  338. _didIteratorError5 = true;
  339. _iteratorError5 = err;
  340. } finally {
  341. try {
  342. if (!_iteratorNormalCompletion5 && _iterator5.return) {
  343. _iterator5.return();
  344. }
  345. } finally {
  346. if (_didIteratorError5) {
  347. throw _iteratorError5;
  348. }
  349. }
  350. }
  351. }
  352. }
  353. }
  354. } catch (err) {
  355. _didIteratorError3 = true;
  356. _iteratorError3 = err;
  357. } finally {
  358. try {
  359. if (!_iteratorNormalCompletion3 && _iterator3.return) {
  360. _iterator3.return();
  361. }
  362. } finally {
  363. if (_didIteratorError3) {
  364. throw _iteratorError3;
  365. }
  366. }
  367. }
  368. if (_result.index > -1) {
  369. result.city = _result.city;
  370. result.code = _result.code;
  371. address = ParseArea.parse_area_by_city(_result.address, result);
  372. }
  373. return address;
  374. }
  375. /**
  376. * 1.3.,2.2 已匹配城市的地址 提取地区
  377. * @param address string
  378. * @param result object
  379. * @returns {string}
  380. */
  381. }, {
  382. key: 'parse_area_by_city',
  383. value: function parse_area_by_city(address, result) {
  384. var areaList = _utils2.default.getTargetAreaListByCode('area', result.code);
  385. var _result = {
  386. area: '',
  387. code: '',
  388. index: -1,
  389. address: '',
  390. isShort: false
  391. };
  392. var _iteratorNormalCompletion6 = true;
  393. var _didIteratorError6 = false;
  394. var _iteratorError6 = undefined;
  395. try {
  396. for (var _iterator6 = areaList[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
  397. var area = _step6.value;
  398. var index = address.indexOf(area.name);
  399. var shortArea = index > -1 ? '' : ParseArea.AreaShort[area.code];
  400. if (shortArea) {
  401. var _Utils$shortIndexOf = _utils2.default.shortIndexOf(address, shortArea, area.name),
  402. _index = _Utils$shortIndexOf.index,
  403. matchName = _Utils$shortIndexOf.matchName;
  404. index = _index;
  405. shortArea = matchName;
  406. }
  407. var areaLength = shortArea ? shortArea.length : area.name.length;
  408. if (index > -1 && (_result.index === -1 || _result.index > index || !shortArea && _result.isShort)) {
  409. _result.area = area.name;
  410. _result.code = area.code;
  411. _result.index = index;
  412. _result.address = address.substr(index + areaLength);
  413. _result.isShort = !!shortArea;
  414. //如果是用短名匹配的 要替换市关键字
  415. if (shortArea) {
  416. var _iteratorNormalCompletion7 = true;
  417. var _didIteratorError7 = false;
  418. var _iteratorError7 = undefined;
  419. try {
  420. for (var _iterator7 = AreaKeys[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {
  421. var key = _step7.value;
  422. if (_result.address.indexOf(key) === 0) {
  423. _result.address = _result.address.substr(key.length);
  424. }
  425. }
  426. } catch (err) {
  427. _didIteratorError7 = true;
  428. _iteratorError7 = err;
  429. } finally {
  430. try {
  431. if (!_iteratorNormalCompletion7 && _iterator7.return) {
  432. _iterator7.return();
  433. }
  434. } finally {
  435. if (_didIteratorError7) {
  436. throw _iteratorError7;
  437. }
  438. }
  439. }
  440. }
  441. }
  442. }
  443. } catch (err) {
  444. _didIteratorError6 = true;
  445. _iteratorError6 = err;
  446. } finally {
  447. try {
  448. if (!_iteratorNormalCompletion6 && _iterator6.return) {
  449. _iterator6.return();
  450. }
  451. } finally {
  452. if (_didIteratorError6) {
  453. throw _iteratorError6;
  454. }
  455. }
  456. }
  457. if (_result.index > -1) {
  458. result.area = _result.area;
  459. result.code = _result.code;
  460. address = _result.address;
  461. }
  462. return address;
  463. }
  464. /**
  465. * 1.4.提取省份但没有提取到城市的地址尝试通过省份下地区匹配
  466. */
  467. }, {
  468. key: 'parse_area_by_province',
  469. value: function parse_area_by_province(address, result) {
  470. var areaList = _utils2.default.getTargetAreaListByCode('area', result.code);
  471. var _iteratorNormalCompletion8 = true;
  472. var _didIteratorError8 = false;
  473. var _iteratorError8 = undefined;
  474. try {
  475. for (var _iterator8 = areaList[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {
  476. var area = _step8.value;
  477. var index = address.indexOf(area.name);
  478. var shortArea = index > -1 ? '' : ParseArea.AreaShort[area.code];
  479. if (shortArea) {
  480. var _Utils$shortIndexOf2 = _utils2.default.shortIndexOf(address, shortArea, area.name),
  481. _index = _Utils$shortIndexOf2.index,
  482. matchName = _Utils$shortIndexOf2.matchName;
  483. index = _index;
  484. shortArea = matchName;
  485. }
  486. var areaLength = shortArea ? shortArea.length : area.name.length;
  487. if (index > -1 && index < 6) {
  488. var _Utils$getTargetAreaL = _utils2.default.getTargetAreaListByCode('city', area.code, true),
  489. _Utils$getTargetAreaL2 = _slicedToArray(_Utils$getTargetAreaL, 1),
  490. city = _Utils$getTargetAreaL2[0];
  491. result.city = city.name;
  492. result.area = area.name;
  493. result.code = area.code;
  494. address = address.substr(index + areaLength);
  495. //如果是用短名匹配的 要替换地区关键字
  496. if (shortArea) {
  497. var _iteratorNormalCompletion9 = true;
  498. var _didIteratorError9 = false;
  499. var _iteratorError9 = undefined;
  500. try {
  501. for (var _iterator9 = AreaKeys[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) {
  502. var key = _step9.value;
  503. if (address.indexOf(key) === 0) {
  504. address = address.substr(key.length);
  505. }
  506. }
  507. } catch (err) {
  508. _didIteratorError9 = true;
  509. _iteratorError9 = err;
  510. } finally {
  511. try {
  512. if (!_iteratorNormalCompletion9 && _iterator9.return) {
  513. _iterator9.return();
  514. }
  515. } finally {
  516. if (_didIteratorError9) {
  517. throw _iteratorError9;
  518. }
  519. }
  520. }
  521. }
  522. break;
  523. }
  524. }
  525. } catch (err) {
  526. _didIteratorError8 = true;
  527. _iteratorError8 = err;
  528. } finally {
  529. try {
  530. if (!_iteratorNormalCompletion8 && _iterator8.return) {
  531. _iterator8.return();
  532. }
  533. } finally {
  534. if (_didIteratorError8) {
  535. throw _iteratorError8;
  536. }
  537. }
  538. }
  539. return address;
  540. }
  541. /**
  542. * 2.1 通过城市识别地址
  543. * @param addressBase string
  544. * @returns {Array}
  545. */
  546. }, {
  547. key: 'parseByCity',
  548. value: function parseByCity(addressBase) {
  549. var city_list = _area2.default.city_list;
  550. var results = [];
  551. var result = {
  552. province: '',
  553. city: '',
  554. area: '',
  555. details: '',
  556. name: '',
  557. code: '',
  558. __type: 'parseByCity',
  559. __parse: false
  560. };
  561. var address = addressBase;
  562. for (var code in city_list) {
  563. var city = city_list[code];
  564. if (city.length < 2) continue;
  565. var index = address.indexOf(city);
  566. var shortCity = index > -1 ? '' : ParseArea.CityShort[code];
  567. var cityLength = shortCity ? shortCity.length : city.length;
  568. if (shortCity) {
  569. index = address.indexOf(shortCity);
  570. }
  571. if (index > -1) {
  572. var _Utils$getTargetAreaL3 = _utils2.default.getTargetAreaListByCode('province', code, true),
  573. _Utils$getTargetAreaL4 = _slicedToArray(_Utils$getTargetAreaL3, 1),
  574. province = _Utils$getTargetAreaL4[0];
  575. result.province = province.name;
  576. result.city = city;
  577. result.code = code;
  578. // 左侧排除省份名剩下的内容识别为姓名
  579. var leftAddress = address.substr(0, index);
  580. var _provinceName = '';
  581. if (leftAddress) {
  582. _provinceName = province.name;
  583. var _index = leftAddress.indexOf(_provinceName);
  584. if (_index === -1) {
  585. _provinceName = ParseArea.ProvinceShort[province.code];
  586. _index = leftAddress.indexOf(_provinceName);
  587. if (_index === -1) _provinceName = '';
  588. }
  589. if (_provinceName) {
  590. leftAddress = leftAddress.replace(new RegExp(_provinceName, 'g'), '');
  591. }
  592. if (leftAddress) {
  593. result.name = leftAddress;
  594. }
  595. }
  596. address = address.substr(index + cityLength);
  597. address = ParseArea.parse_area_by_city(address, result);
  598. if (_provinceName || result.area) {
  599. result.__parse = true;
  600. break;
  601. } else {
  602. //如果没有识别到省份和地区 缓存本次结果,并重置数据
  603. results.unshift(_extends({}, result, { details: address.trim() }));
  604. result.name = '';
  605. result.city = '';
  606. result.province = '';
  607. result.code = '';
  608. address = addressBase;
  609. }
  610. }
  611. }
  612. if (result.code) {
  613. results.unshift(_extends({}, result, { details: address.trim() }));
  614. }
  615. return results;
  616. }
  617. /**
  618. * 3 通过地区识别地址
  619. * @returns {Array}
  620. */
  621. }, {
  622. key: 'parseByArea',
  623. value: function parseByArea(addressBase) {
  624. var area_list = _area2.default.area_list;
  625. var results = [];
  626. var result = {
  627. province: '',
  628. city: '',
  629. area: '',
  630. details: '',
  631. name: '',
  632. code: '',
  633. __type: 'parseByArea',
  634. __parse: false
  635. };
  636. var address = addressBase;
  637. for (var code in area_list) {
  638. var area = area_list[code];
  639. if (area.length < 2) continue;
  640. var index = address.indexOf(area);
  641. var shortArea = index > -1 ? '' : ParseArea.AreaShort[code];
  642. if (shortArea) {
  643. var _Utils$shortIndexOf3 = _utils2.default.shortIndexOf(address, shortArea, area),
  644. _index = _Utils$shortIndexOf3.index,
  645. matchName = _Utils$shortIndexOf3.matchName;
  646. index = _index;
  647. shortArea = matchName;
  648. }
  649. var areaLength = shortArea ? shortArea.length : area.length;
  650. if (index > -1) {
  651. var _Utils$getTargetAreaL5 = _utils2.default.getTargetAreaListByCode('province', code, true),
  652. _Utils$getTargetAreaL6 = _slicedToArray(_Utils$getTargetAreaL5, 2),
  653. province = _Utils$getTargetAreaL6[0],
  654. city = _Utils$getTargetAreaL6[1];
  655. result.province = province.name;
  656. result.city = city.name;
  657. result.area = area;
  658. result.code = code;
  659. // 左侧排除省份城市名剩下的内容识别为姓名
  660. var leftAddress = address.substr(0, index);
  661. var _provinceName = '',
  662. _cityName = '';
  663. if (leftAddress) {
  664. _provinceName = province.name;
  665. var _index2 = leftAddress.indexOf(_provinceName);
  666. if (_index2 === -1) {
  667. _provinceName = ParseArea.ProvinceShort[province.code];
  668. _index2 = leftAddress.indexOf(_provinceName);
  669. if (_index2 === -1) _provinceName = '';
  670. }
  671. if (_provinceName) {
  672. leftAddress = leftAddress.replace(new RegExp(_provinceName, 'g'), '');
  673. }
  674. _cityName = city.name;
  675. _index2 = leftAddress.indexOf(_cityName);
  676. if (_index2 === -1) {
  677. _cityName = ParseArea.CityShort[city.code];
  678. _index2 = leftAddress.indexOf(_cityName);
  679. if (_index2 === -1) _cityName = '';
  680. }
  681. if (_cityName) {
  682. leftAddress = leftAddress.replace(new RegExp(_cityName, 'g'), '');
  683. }
  684. if (leftAddress) {
  685. result.name = leftAddress;
  686. }
  687. }
  688. // 出现同省地区匹配错误处理,广东省惠来县惠城镇 如不经处理匹配到 广东省惠州市惠城区
  689. if (_provinceName && !_cityName) {
  690. var _ParseArea$parseByAre = ParseArea.parseByArea(address.substr(0, index)),
  691. _ParseArea$parseByAre2 = _slicedToArray(_ParseArea$parseByAre, 1),
  692. _result = _ParseArea$parseByAre2[0];
  693. if (_result && _result.__parse) {
  694. Object.assign(result, _result);
  695. address = address.substr(index).trim();
  696. if (!result.area) {
  697. address = ParseArea.parse_area_by_city(address, result);
  698. }
  699. result.__parse = 2;
  700. break;
  701. }
  702. }
  703. if (shortArea && address.charAt(index + areaLength) === '县') index += 1;
  704. address = address.substr(index + areaLength);
  705. if (_provinceName || _cityName) {
  706. result.__parse = true;
  707. break;
  708. } else {
  709. //如果没有识别到省份和地区 缓存本次结果,并重置数据
  710. results.unshift(_extends({}, result, { details: address.trim() }));
  711. result.name = '';
  712. result.city = '';
  713. result.area = '';
  714. result.province = '';
  715. result.code = '';
  716. address = addressBase;
  717. }
  718. }
  719. }
  720. if (result.code) {
  721. results.unshift(_extends({}, result, { details: address.trim() }));
  722. }
  723. return results;
  724. }
  725. }]);
  726. return ParseArea;
  727. }();
  728. ParseArea.isInit = false;
  729. ParseArea.ProvinceShortList = [];
  730. ParseArea.ProvinceShort = {};
  731. ParseArea.CityShort = {};
  732. ParseArea.AreaShort = {};
  733. exports.default = ParseArea;