thai-postcode-helper
Version:
Thai address postcode resolver with fuzzy and bilingual support
80 lines (79 loc) • 3.55 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.findPostcode = findPostcode;
exports.findByPostcode = findByPostcode;
exports.suggestSubdistricts = suggestSubdistricts;
exports.suggestSubdistrictsFuzzy = suggestSubdistrictsFuzzy;
exports.findPostcodeFuzzy = findPostcodeFuzzy;
const data_json_1 = __importDefault(require("../data/data.json"));
const utils_1 = require("./utils");
const fuse_js_1 = __importDefault(require("fuse.js"));
const data = data_json_1.default;
function findPostcode(province, district, subdistrict, lang = 'th') {
return data
.filter(entry => (0, utils_1.normalize)(entry[`province_${lang}`]) === (0, utils_1.normalize)(province) &&
(0, utils_1.normalize)(entry[`district_${lang}`]) === (0, utils_1.normalize)(district) &&
(0, utils_1.normalize)(entry[`subdistrict_${lang}`]) === (0, utils_1.normalize)(subdistrict))
.map(entry => entry.zipcode);
}
function findByPostcode(zipcode, lang = 'th') {
return data
.filter(entry => entry.zipcode === zipcode)
.map(entry => ({
province: entry[`province_${lang}`],
district: entry[`district_${lang}`],
subdistrict: entry[`subdistrict_${lang}`],
zipcode: entry.zipcode,
}));
}
function suggestSubdistricts(province, district, lang = 'th') {
return Array.from(new Set(data
.filter(entry => {
if (province && (0, utils_1.normalize)(entry[`province_${lang}`]) !== (0, utils_1.normalize)(province))
return false;
if (district && (0, utils_1.normalize)(entry[`district_${lang}`]) !== (0, utils_1.normalize)(district))
return false;
return true;
})
.map(entry => entry[`subdistrict_${lang}`])));
}
function suggestSubdistrictsFuzzy(keyword, lang = 'th', limit = 10) {
const entries = Array.from(new Set(data.map(entry => entry[`subdistrict_${lang}`])));
const fuse = new fuse_js_1.default(entries, {
threshold: 0.4,
});
return fuse.search(keyword).slice(0, limit).map(r => r.item);
}
function findPostcodeFuzzy(provinceInput, districtInput, subdistrictInput, lang = 'th') {
var _a, _b, _c;
const provKey = `province_${lang}`;
const distKey = `district_${lang}`;
const subdistKey = `subdistrict_${lang}`;
const provinceFuse = new fuse_js_1.default(data, {
keys: [provKey],
threshold: 0.4
});
const matchedProvince = (_a = provinceFuse.search(provinceInput)[0]) === null || _a === void 0 ? void 0 : _a.item;
if (!matchedProvince)
return [];
const filteredByProvince = data.filter(d => d[provKey] === matchedProvince[provKey]);
const districtFuse = new fuse_js_1.default(filteredByProvince, {
keys: [distKey],
threshold: 0.4
});
const matchedDistrict = (_b = districtFuse.search(districtInput)[0]) === null || _b === void 0 ? void 0 : _b.item;
if (!matchedDistrict)
return [];
const filteredByDistrict = filteredByProvince.filter(d => d[distKey] === matchedDistrict[distKey]);
const subdistrictFuse = new fuse_js_1.default(filteredByDistrict, {
keys: [subdistKey],
threshold: 0.4
});
const matchedSubdistrict = (_c = subdistrictFuse.search(subdistrictInput)[0]) === null || _c === void 0 ? void 0 : _c.item;
if (!matchedSubdistrict)
return [];
return [matchedSubdistrict.zipcode];
}