parse-area.js 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805
  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. }
  116. }
  117. }
  118. } catch (err) {
  119. _didIteratorError = true;
  120. _iteratorError = err;
  121. } finally {
  122. try {
  123. if (!_iteratorNormalCompletion && _iterator.return) {
  124. _iterator.return();
  125. }
  126. } finally {
  127. if (_didIteratorError) {
  128. throw _iteratorError;
  129. }
  130. }
  131. }
  132. }
  133. // 可信度排序
  134. this.results.sort(function (a, b) {
  135. return 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;
  136. });
  137. return this.results;
  138. }
  139. /**
  140. * 1.1 提取省份
  141. */
  142. }], [{
  143. key: 'parseByProvince',
  144. value: function parseByProvince(addressBase) {
  145. var province_list = _area2.default.province_list;
  146. var results = [];
  147. var result = {
  148. province: '',
  149. city: '',
  150. area: '',
  151. details: '',
  152. name: '',
  153. code: '',
  154. __type: 'parseByProvince',
  155. __parse: false
  156. };
  157. var address = addressBase;
  158. for (var code in province_list) {
  159. var province = province_list[code];
  160. var index = address.indexOf(province);
  161. var shortProvince = index > -1 ? '' : ParseArea.ProvinceShort[code];
  162. var provinceLength = shortProvince ? shortProvince.length : province.length;
  163. if (shortProvince) {
  164. index = address.indexOf(shortProvince);
  165. }
  166. if (index > -1) {
  167. // 如果省份不是第一位 在省份之前的字段识别为名称
  168. if (index > 0) {
  169. result.name = address.substr(0, index).trim();
  170. address = address.substr(index).trim();
  171. }
  172. result.province = province;
  173. result.code = code;
  174. var _address = address.substr(provinceLength);
  175. if (_address.charAt(0) !== '市' || _address.indexOf(province) > -1) {
  176. address = _address;
  177. }
  178. //如果是用短名匹配的 要替换省关键字
  179. if (shortProvince) {
  180. var _iteratorNormalCompletion2 = true;
  181. var _didIteratorError2 = false;
  182. var _iteratorError2 = undefined;
  183. try {
  184. for (var _iterator2 = ProvinceKeys[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
  185. var key = _step2.value;
  186. if (address.indexOf(ProvinceKeys[key]) === 0) {
  187. address = address.substr(ProvinceKeys[key].length);
  188. }
  189. }
  190. } catch (err) {
  191. _didIteratorError2 = true;
  192. _iteratorError2 = err;
  193. } finally {
  194. try {
  195. if (!_iteratorNormalCompletion2 && _iterator2.return) {
  196. _iterator2.return();
  197. }
  198. } finally {
  199. if (_didIteratorError2) {
  200. throw _iteratorError2;
  201. }
  202. }
  203. }
  204. }
  205. var __address = ParseArea.parse_city_by_province(address, result);
  206. if (!result.city) {
  207. __address = ParseArea.parse_area_by_province(address, result);
  208. }
  209. if (result.city) {
  210. result.__parse = true;
  211. address = __address;
  212. // 因为详细地址内包含其他地区数据导致解析失败的解决方案
  213. // 为避免边界问题 含省份名才触发,如果是伊宁市上海城徐汇苑不触发
  214. if (index > 4 && ParseArea.ProvinceShortList.some(function (shortProvince) {
  215. return result.name.includes(shortProvince);
  216. })) {
  217. var _ParseArea$parseByPro = ParseArea.parseByProvince(result.name),
  218. _ParseArea$parseByPro2 = _slicedToArray(_ParseArea$parseByPro, 1),
  219. _result = _ParseArea$parseByPro2[0];
  220. if (_result.__parse) {
  221. Object.assign(result, _result);
  222. address = addressBase.substr(index).trim();
  223. if (!result.area) {
  224. address = ParseArea.parse_area_by_city(address, result);
  225. }
  226. result.__parse = 3;
  227. }
  228. }
  229. break;
  230. } else {
  231. //如果没有识别到地区 缓存本次结果,并重置数据
  232. results.unshift(_extends({}, result, { details: address.trim() }));
  233. result.province = '';
  234. result.code = '';
  235. result.name = '';
  236. address = addressBase;
  237. }
  238. }
  239. }
  240. if (result.code) {
  241. results.unshift(_extends({}, result, { details: address.trim() }));
  242. }
  243. return results;
  244. }
  245. /**
  246. * 1.2.提取城市
  247. * @returns {boolean}
  248. */
  249. }, {
  250. key: 'parse_city_by_province',
  251. value: function parse_city_by_province(address, result) {
  252. var cityList = _utils2.default.getTargetAreaListByCode('city', result.code);
  253. var _result = {
  254. city: '',
  255. code: '',
  256. index: -1,
  257. address: '',
  258. isShort: false
  259. };
  260. var _iteratorNormalCompletion3 = true;
  261. var _didIteratorError3 = false;
  262. var _iteratorError3 = undefined;
  263. try {
  264. for (var _iterator3 = cityList[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
  265. var city = _step3.value;
  266. var index = address.indexOf(city.name);
  267. var shortCity = index > -1 ? '' : ParseArea.CityShort[city.code];
  268. var cityLength = shortCity ? shortCity.length : city.name.length;
  269. if (shortCity) {
  270. index = address.indexOf(shortCity);
  271. }
  272. if (index > -1 && (_result.index === -1 || _result.index > index || !shortCity && _result.isShort)) {
  273. _result.city = city.name;
  274. _result.code = city.code;
  275. _result.index = index;
  276. _result.address = address.substr(index + cityLength);
  277. _result.isShort = !!shortCity;
  278. //如果是用短名匹配的 要替换市关键字
  279. if (shortCity) {
  280. var _iteratorNormalCompletion4 = true;
  281. var _didIteratorError4 = false;
  282. var _iteratorError4 = undefined;
  283. try {
  284. for (var _iterator4 = CityKeys[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
  285. var key = _step4.value;
  286. if (address.indexOf(key) === 0) {
  287. //排除几个会导致异常的解析
  288. if (key !== '市' && !['市北区', '市南区', '市中区', '市辖区'].some(function (v) {
  289. return address.indexOf(v) === 0;
  290. })) {
  291. address = address.substr(key.length);
  292. }
  293. }
  294. }
  295. } catch (err) {
  296. _didIteratorError4 = true;
  297. _iteratorError4 = err;
  298. } finally {
  299. try {
  300. if (!_iteratorNormalCompletion4 && _iterator4.return) {
  301. _iterator4.return();
  302. }
  303. } finally {
  304. if (_didIteratorError4) {
  305. throw _iteratorError4;
  306. }
  307. }
  308. }
  309. }
  310. }
  311. if (index > -1 && index < 3) {
  312. result.city = city.name;
  313. result.code = city.code;
  314. _result.address = address.substr(index + cityLength);
  315. //如果是用短名匹配的 要替换市关键字
  316. if (shortCity) {
  317. var _iteratorNormalCompletion5 = true;
  318. var _didIteratorError5 = false;
  319. var _iteratorError5 = undefined;
  320. try {
  321. for (var _iterator5 = CityKeys[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
  322. var _key = _step5.value;
  323. if (_result.address.indexOf(_key) === 0) {
  324. //排除几个会导致异常的解析
  325. if (_key !== '市' && !['市北区', '市南区', '市中区', '市辖区'].some(function (v) {
  326. return _result.address.indexOf(v) === 0;
  327. })) {
  328. _result.address = _result.address.substr(_key.length);
  329. }
  330. }
  331. }
  332. } catch (err) {
  333. _didIteratorError5 = true;
  334. _iteratorError5 = err;
  335. } finally {
  336. try {
  337. if (!_iteratorNormalCompletion5 && _iterator5.return) {
  338. _iterator5.return();
  339. }
  340. } finally {
  341. if (_didIteratorError5) {
  342. throw _iteratorError5;
  343. }
  344. }
  345. }
  346. }
  347. }
  348. }
  349. } catch (err) {
  350. _didIteratorError3 = true;
  351. _iteratorError3 = err;
  352. } finally {
  353. try {
  354. if (!_iteratorNormalCompletion3 && _iterator3.return) {
  355. _iterator3.return();
  356. }
  357. } finally {
  358. if (_didIteratorError3) {
  359. throw _iteratorError3;
  360. }
  361. }
  362. }
  363. if (_result.index > -1) {
  364. result.city = _result.city;
  365. result.code = _result.code;
  366. address = ParseArea.parse_area_by_city(_result.address, result);
  367. }
  368. return address;
  369. }
  370. /**
  371. * 1.3.,2.2 已匹配城市的地址 提取地区
  372. * @param address string
  373. * @param result object
  374. * @returns {string}
  375. */
  376. }, {
  377. key: 'parse_area_by_city',
  378. value: function parse_area_by_city(address, result) {
  379. var areaList = _utils2.default.getTargetAreaListByCode('area', result.code);
  380. var _result = {
  381. area: '',
  382. code: '',
  383. index: -1,
  384. address: '',
  385. isShort: false
  386. };
  387. var _iteratorNormalCompletion6 = true;
  388. var _didIteratorError6 = false;
  389. var _iteratorError6 = undefined;
  390. try {
  391. for (var _iterator6 = areaList[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
  392. var area = _step6.value;
  393. var index = address.indexOf(area.name);
  394. var shortArea = index > -1 ? '' : ParseArea.AreaShort[area.code];
  395. if (shortArea) {
  396. var _Utils$shortIndexOf = _utils2.default.shortIndexOf(address, shortArea, area.name),
  397. _index = _Utils$shortIndexOf.index,
  398. matchName = _Utils$shortIndexOf.matchName;
  399. index = _index;
  400. shortArea = matchName;
  401. }
  402. var areaLength = shortArea ? shortArea.length : area.name.length;
  403. if (index > -1 && (_result.index === -1 || _result.index > index || !shortArea && _result.isShort)) {
  404. _result.area = area.name;
  405. _result.code = area.code;
  406. _result.index = index;
  407. _result.address = address.substr(index + areaLength);
  408. _result.isShort = !!shortArea;
  409. //如果是用短名匹配的 要替换市关键字
  410. if (shortArea) {
  411. var _iteratorNormalCompletion7 = true;
  412. var _didIteratorError7 = false;
  413. var _iteratorError7 = undefined;
  414. try {
  415. for (var _iterator7 = AreaKeys[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {
  416. var key = _step7.value;
  417. if (_result.address.indexOf(key) === 0) {
  418. _result.address = _result.address.substr(key.length);
  419. }
  420. }
  421. } catch (err) {
  422. _didIteratorError7 = true;
  423. _iteratorError7 = err;
  424. } finally {
  425. try {
  426. if (!_iteratorNormalCompletion7 && _iterator7.return) {
  427. _iterator7.return();
  428. }
  429. } finally {
  430. if (_didIteratorError7) {
  431. throw _iteratorError7;
  432. }
  433. }
  434. }
  435. }
  436. }
  437. }
  438. } catch (err) {
  439. _didIteratorError6 = true;
  440. _iteratorError6 = err;
  441. } finally {
  442. try {
  443. if (!_iteratorNormalCompletion6 && _iterator6.return) {
  444. _iterator6.return();
  445. }
  446. } finally {
  447. if (_didIteratorError6) {
  448. throw _iteratorError6;
  449. }
  450. }
  451. }
  452. if (_result.index > -1) {
  453. result.area = _result.area;
  454. result.code = _result.code;
  455. address = _result.address;
  456. }
  457. return address;
  458. }
  459. /**
  460. * 1.4.提取省份但没有提取到城市的地址尝试通过省份下地区匹配
  461. */
  462. }, {
  463. key: 'parse_area_by_province',
  464. value: function parse_area_by_province(address, result) {
  465. var areaList = _utils2.default.getTargetAreaListByCode('area', result.code);
  466. var _iteratorNormalCompletion8 = true;
  467. var _didIteratorError8 = false;
  468. var _iteratorError8 = undefined;
  469. try {
  470. for (var _iterator8 = areaList[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {
  471. var area = _step8.value;
  472. var index = address.indexOf(area.name);
  473. var shortArea = index > -1 ? '' : ParseArea.AreaShort[area.code];
  474. if (shortArea) {
  475. var _Utils$shortIndexOf2 = _utils2.default.shortIndexOf(address, shortArea, area.name),
  476. _index = _Utils$shortIndexOf2.index,
  477. matchName = _Utils$shortIndexOf2.matchName;
  478. index = _index;
  479. shortArea = matchName;
  480. }
  481. var areaLength = shortArea ? shortArea.length : area.name.length;
  482. if (index > -1 && index < 6) {
  483. var _Utils$getTargetAreaL = _utils2.default.getTargetAreaListByCode('city', area.code, true),
  484. _Utils$getTargetAreaL2 = _slicedToArray(_Utils$getTargetAreaL, 1),
  485. city = _Utils$getTargetAreaL2[0];
  486. result.city = city.name;
  487. result.area = area.name;
  488. result.code = area.code;
  489. address = address.substr(index + areaLength);
  490. //如果是用短名匹配的 要替换地区关键字
  491. if (shortArea) {
  492. var _iteratorNormalCompletion9 = true;
  493. var _didIteratorError9 = false;
  494. var _iteratorError9 = undefined;
  495. try {
  496. for (var _iterator9 = AreaKeys[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) {
  497. var key = _step9.value;
  498. if (address.indexOf(key) === 0) {
  499. address = address.substr(key.length);
  500. }
  501. }
  502. } catch (err) {
  503. _didIteratorError9 = true;
  504. _iteratorError9 = err;
  505. } finally {
  506. try {
  507. if (!_iteratorNormalCompletion9 && _iterator9.return) {
  508. _iterator9.return();
  509. }
  510. } finally {
  511. if (_didIteratorError9) {
  512. throw _iteratorError9;
  513. }
  514. }
  515. }
  516. }
  517. break;
  518. }
  519. }
  520. } catch (err) {
  521. _didIteratorError8 = true;
  522. _iteratorError8 = err;
  523. } finally {
  524. try {
  525. if (!_iteratorNormalCompletion8 && _iterator8.return) {
  526. _iterator8.return();
  527. }
  528. } finally {
  529. if (_didIteratorError8) {
  530. throw _iteratorError8;
  531. }
  532. }
  533. }
  534. return address;
  535. }
  536. /**
  537. * 2.1 通过城市识别地址
  538. * @param addressBase string
  539. * @returns {Array}
  540. */
  541. }, {
  542. key: 'parseByCity',
  543. value: function parseByCity(addressBase) {
  544. var city_list = _area2.default.city_list;
  545. var results = [];
  546. var result = {
  547. province: '',
  548. city: '',
  549. area: '',
  550. details: '',
  551. name: '',
  552. code: '',
  553. __type: 'parseByCity',
  554. __parse: false
  555. };
  556. var address = addressBase;
  557. for (var code in city_list) {
  558. var city = city_list[code];
  559. if (city.length < 2) continue;
  560. var index = address.indexOf(city);
  561. var shortCity = index > -1 ? '' : ParseArea.CityShort[code];
  562. var cityLength = shortCity ? shortCity.length : city.length;
  563. if (shortCity) {
  564. index = address.indexOf(shortCity);
  565. }
  566. if (index > -1) {
  567. var _Utils$getTargetAreaL3 = _utils2.default.getTargetAreaListByCode('province', code, true),
  568. _Utils$getTargetAreaL4 = _slicedToArray(_Utils$getTargetAreaL3, 1),
  569. province = _Utils$getTargetAreaL4[0];
  570. result.province = province.name;
  571. result.city = city;
  572. result.code = code;
  573. // 左侧排除省份名剩下的内容识别为姓名
  574. var leftAddress = address.substr(0, index);
  575. var _provinceName = '';
  576. if (leftAddress) {
  577. _provinceName = province.name;
  578. var _index = leftAddress.indexOf(_provinceName);
  579. if (_index === -1) {
  580. _provinceName = ParseArea.ProvinceShort[province.code];
  581. _index = leftAddress.indexOf(_provinceName);
  582. if (_index === -1) _provinceName = '';
  583. }
  584. if (_provinceName) {
  585. leftAddress = leftAddress.replace(new RegExp(_provinceName, 'g'), '');
  586. }
  587. if (leftAddress) {
  588. result.name = leftAddress;
  589. }
  590. }
  591. address = address.substr(index + cityLength);
  592. address = ParseArea.parse_area_by_city(address, result);
  593. if (_provinceName || result.area) {
  594. result.__parse = true;
  595. break;
  596. } else {
  597. //如果没有识别到省份和地区 缓存本次结果,并重置数据
  598. results.unshift(_extends({}, result, { details: address.trim() }));
  599. result.name = '';
  600. result.city = '';
  601. result.province = '';
  602. result.code = '';
  603. address = addressBase;
  604. }
  605. }
  606. }
  607. if (result.code) {
  608. results.unshift(_extends({}, result, { details: address.trim() }));
  609. }
  610. return results;
  611. }
  612. /**
  613. * 3 通过地区识别地址
  614. * @returns {Array}
  615. */
  616. }, {
  617. key: 'parseByArea',
  618. value: function parseByArea(addressBase) {
  619. var area_list = _area2.default.area_list;
  620. var results = [];
  621. var result = {
  622. province: '',
  623. city: '',
  624. area: '',
  625. details: '',
  626. name: '',
  627. code: '',
  628. __type: 'parseByArea',
  629. __parse: false
  630. };
  631. var address = addressBase;
  632. for (var code in area_list) {
  633. var area = area_list[code];
  634. if (area.length < 2) continue;
  635. var index = address.indexOf(area);
  636. var shortArea = index > -1 ? '' : ParseArea.AreaShort[code];
  637. if (shortArea) {
  638. var _Utils$shortIndexOf3 = _utils2.default.shortIndexOf(address, shortArea, area),
  639. _index = _Utils$shortIndexOf3.index,
  640. matchName = _Utils$shortIndexOf3.matchName;
  641. index = _index;
  642. shortArea = matchName;
  643. }
  644. var areaLength = shortArea ? shortArea.length : area.length;
  645. if (index > -1) {
  646. var _Utils$getTargetAreaL5 = _utils2.default.getTargetAreaListByCode('province', code, true),
  647. _Utils$getTargetAreaL6 = _slicedToArray(_Utils$getTargetAreaL5, 2),
  648. province = _Utils$getTargetAreaL6[0],
  649. city = _Utils$getTargetAreaL6[1];
  650. result.province = province.name;
  651. result.city = city.name;
  652. result.area = area;
  653. result.code = code;
  654. // 左侧排除省份城市名剩下的内容识别为姓名
  655. var leftAddress = address.substr(0, index);
  656. var _provinceName = '',
  657. _cityName = '';
  658. if (leftAddress) {
  659. _provinceName = province.name;
  660. var _index2 = leftAddress.indexOf(_provinceName);
  661. if (_index2 === -1) {
  662. _provinceName = ParseArea.ProvinceShort[province.code];
  663. _index2 = leftAddress.indexOf(_provinceName);
  664. if (_index2 === -1) _provinceName = '';
  665. }
  666. if (_provinceName) {
  667. leftAddress = leftAddress.replace(new RegExp(_provinceName, 'g'), '');
  668. }
  669. _cityName = city.name;
  670. _index2 = leftAddress.indexOf(_cityName);
  671. if (_index2 === -1) {
  672. _cityName = ParseArea.CityShort[city.code];
  673. _index2 = leftAddress.indexOf(_cityName);
  674. if (_index2 === -1) _cityName = '';
  675. }
  676. if (_cityName) {
  677. leftAddress = leftAddress.replace(new RegExp(_cityName, 'g'), '');
  678. }
  679. if (leftAddress) {
  680. result.name = leftAddress;
  681. }
  682. }
  683. // 出现同省地区匹配错误处理,广东省惠来县惠城镇 如不经处理匹配到 广东省惠州市惠城区
  684. if (_provinceName && !_cityName) {
  685. var _ParseArea$parseByAre = ParseArea.parseByArea(address.substr(0, index)),
  686. _ParseArea$parseByAre2 = _slicedToArray(_ParseArea$parseByAre, 1),
  687. _result = _ParseArea$parseByAre2[0];
  688. if (_result && _result.__parse) {
  689. Object.assign(result, _result);
  690. address = address.substr(index).trim();
  691. if (!result.area) {
  692. address = ParseArea.parse_area_by_city(address, result);
  693. }
  694. result.__parse = 2;
  695. break;
  696. }
  697. }
  698. address = address.substr(index + areaLength);
  699. if (_provinceName || _cityName) {
  700. result.__parse = true;
  701. break;
  702. } else {
  703. //如果没有识别到省份和地区 缓存本次结果,并重置数据
  704. results.unshift(_extends({}, result, { details: address.trim() }));
  705. result.name = '';
  706. result.city = '';
  707. result.area = '';
  708. result.province = '';
  709. result.code = '';
  710. address = addressBase;
  711. }
  712. }
  713. }
  714. if (result.code) {
  715. results.unshift(_extends({}, result, { details: address.trim() }));
  716. }
  717. return results;
  718. }
  719. }]);
  720. return ParseArea;
  721. }();
  722. ParseArea.isInit = false;
  723. ParseArea.ProvinceShortList = [];
  724. ParseArea.ProvinceShort = {};
  725. ParseArea.CityShort = {};
  726. ParseArea.AreaShort = {};
  727. exports.default = ParseArea;