【发布时间】:2020-12-11 10:44:48
【问题描述】:
我有一个 CSV 文件,其中包含大约 40K 条目和 3 列 - 值、城市和类别
以下是结构:
Value Class City
111 lev 0 New York
112 lev 1 Winston
113 lev 2 Dakota
114 lev 2 Washington
class lev-0 是 level-1 的父级,它是 lev-2 的父级 (lev-0>lev-1>lev-2)
现在我有 3 个选择框父区域、子区域、子子区域
我为返回所选值的父区域设置了一个 onchange 侦听器,然后在 CSV 文件中进行搜索,一旦将其下方的所有元素与 class= lev-1 匹配,就用于为选择框子项创建选项列表使用 while 循环的区域,直到 class= lev-0 是循环停止的位置。
问题是,一旦我选择了一个元素,选择框需要大约 3-4 秒才能被填充,而且很多时候它甚至会挂起浏览器。
我正在使用 Papa Parser 来解析 CSV
const csv = "https://example.com/locations.csv";
let results = [];
const csvData = Papa.parse(csv, {
header: true,
download: true,
complete: response => {
results = response.data;
}
});
以下是使用值作为输入获取类名和城市名的函数
function findCityByName(inputVal) {
return results.filter(data => data.Value == inputVal)[0].City;
}
function findClassbyValue(inputVal) {
return results.filter(data => data.Value == inputVal)[0].Class;
}
以下是为选择框子区域创建选项值的代码
function GetChildRegions(inputVal){
var inputVal2 = inputVal;
var currentObject = results.filter(data => data.Value == inputVal2)[0];
currentIndex = results.indexOf(currentObject);
//move to next object
currentObject = results.filter(data => data)[currentIndex + 1];
currentClass = findClassbyValue(currentObject.Value);
var RegionDropOption;
while (currentClass != 'level-0') {
if(currentClass == 'level-1'){
RegionDropOption += '<option value="' + currentObject.Value + '">' + currentObject.City + '</option>\n';
currentIndex = results.indexOf(currentObject);
currentIndex++;
currentObject = results.filter(data => data)[currentIndex];
currentClass = findClassbyValue(currentObject.Value);
}
}
return RegionDropOption;
}
以下是在父区域更改事件时在子区域选择框中注入html代码的jquery
jQuery("#Parent_region").change(function() {
var selectedMainRegion = jQuery('#Parent_region').find(":selected").val();
jQuery("#child_region").html(GetChildRegions(selectedMainRegion));
});
如何让搜索更快?
编辑:
添加缓存(记忆)
Momoizer 功能
function memoizer(fun){
let cache = {}
return function (n){
if (cache[n] != undefined ) {
return cache[n]
} else {
console.log(n);
**let result = fun(n) // Result is Undefined here**
cache[n] = result
return result
}
}
}
被记忆的功能。
function GetSubRegion(selectedMainRegion){
if (typeof(subRegWorker) != "undefined") {
subRegWorker.terminate();
}
subRegWorker = new Worker("subRegWorker.js");
subRegWorker.onmessage = function(e) {
var workData = e.data;
jQuery("#_sub_region").html(workData);
subRegWorker.terminate();
return workData;
}
subRegWorker.postMessage(selectedMainRegion);
}
示例 - var hello = GetSubRegion(123); 你好在这里是未定义的。怎么解决?
在变化时调用记忆函数
jQuery("#_main_region").change(function() {
var getCacheSub = memoizer(GetSubRegion);
var inputMainRegion = jQuery('#_main_region').find(":selected").val();
getCacheSub(inputMainRegion);
});
【问题讨论】:
标签: javascript jquery json performance parsing