province-city-china
Version:
An util to query china province, city and district data. 中华人民共和国国家标准 GB/T 2260 行政区划代码。
72 lines (67 loc) • 2.31 kB
JavaScript
/**
* 县级(区县)信息
* @param {Array} arr 总数组
* @param {Number} code 县级(区县) code
* @param {Number} level [0,1,2,3] 返回层级
*/
exports.findAreaChild = function findAreaChild(arr, code, level) {
return arr.filter(item => {
// 四个直辖市 北京:11, 上海:31,天津:12,重庆市:50
if (/(11|31|12|50)/.test(item.province)) {
return (new RegExp(`^${code}`)).test(item.code) && item.town !== 0;
}
return (new RegExp(`^${code}`)).test(item.code) && item.town === 0 && item.area !== 0;
}).map((item) => {
return { ...item };
})
}
/**
* 序列化省市信息
* @param {Array} arr 总数组
* @return {Array} [序列化后的层级总数组]
*/
exports.findCityChild = function findCityChild(arr, code, level) {
return arr.filter(item => {
if (/(70|81|82)/.test(item.province)) {
return false;
}
// 四个直辖市 北京:11, 上海:31,天津:12,重庆市:50
if (/(11|31|12|50)/.test(item.province)) {
return (new RegExp(`^${code}`)).test(item.code) && item.area !== 0 && item.town === 0;
}
return (new RegExp(`^${code}`)).test(item.code) && item.city !== 0 && item.area === 0 && item.town === 0;
}).map((item) => {
if (level > 1) {
const codeCom = /(11|31|12|50)/.test(item.province) ? `${code}${item.city}${item.area}` : `${code}${item.city}`;
item.children = findAreaChild(arr, codeCom, level);
}
delete item.town;
delete item.province;
return {
...item,
// code: /(11|31|12|50)/.test(code) ? item.area : item.city,
}
});
}
/**
* 序列化 省市区信息 第一级
* @param {Array} arr 总数组
* @param {Number} level [0,1,2,3] 返回层级
* @return {Array} [序列化后的总数组]
*/
exports.sortProvince = function sortProvince(arr, level) {
if (!level) level = 3;
return arr.filter(item => item.city === 0 && item.area === 0 && item.town === 0)
.map((item) => {
if (level > 0) {
item.children = findCityChild([...arr], item.province, level);
}
item.code = item.province;
if (item.children && item.children.length === 0) delete item.children;
delete item.province;
delete item.city;
delete item.area;
delete item.town;
return { ...item };
});
}