Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
提高javascript中多字符串搜索的性能_Javascript_Arrays_Performance - Fatal编程技术网

提高javascript中多字符串搜索的性能

提高javascript中多字符串搜索的性能,javascript,arrays,performance,Javascript,Arrays,Performance,我正在搜索长度超过10000的大数组集 示例数组应该如下所示 let data = ['Hello world mr tom', ........]; // array length of 10000 with different strings 这是我的密码 this.results = []; for (let i = 0; i < data.length; i++) { if (input.toLowerCase().split(' ').every(val => dat

我正在搜索长度超过10000的大数组集

示例数组应该如下所示

let data = ['Hello world mr tom', ........]; // array length of 10000 with different strings
这是我的密码

this.results = [];
for (let i = 0; i < data.length; i++) {
  if (input.toLowerCase().split(' ').every(val => data[i].toLowerCase().includes(val))) {
    this.results.push(data[i])
  }
}
this.results=[];
for(设i=0;idata[i].toLowerCase().includes(val))){
this.results.push(数据[i])
}
}
它正在工作,但加载时间太长。假设在我的数组列表中有一个名为
Hello world
的公共字符串,在输入字段中输入该字符串时,加载该字符串花费的时间太长。是否有任何优化方法可以在更短的时间内完成此搜索。

  • 添加一个去盎司函数。不要立即过滤数据-而是等到用户停止键入500毫秒左右,然后执行过滤操作

    let timeoutId;
    input.addEventListener('input', () => {
      clearTimeout(timeoutId);
      timeoutId = setTimeout(filterResults, 500);
    });
    
    (其中,
    filterResults
    ,当然,使用输入值过滤结果)

  • 数据
    元素上调用
    toLowerCase
    ,只需提前调用一次,而不是在循环中的每次迭代或每次输入更改之后:

    const data = [/* your data */];
    const lowerData = data.map(str => str.toLowerCase());
    // then use `lowerData` instead
    
  • 预先对循环外部的输入字符串调用
    toLowerCase
    .split
    ,而不是每次迭代

  • 客户端不适合处理大量数据,尤其是在低端手机上。表现不佳。对于大量的数据,请考虑做过滤服务器端。
  • 如果您别无选择,只能在客户端执行此操作,请在单独的Web Worker中执行计算,以便页面的主UI在运行时保持响应

      • 添加一个去盎司函数。不要立即过滤数据-而是等到用户停止键入500毫秒左右,然后执行过滤操作

        let timeoutId;
        input.addEventListener('input', () => {
          clearTimeout(timeoutId);
          timeoutId = setTimeout(filterResults, 500);
        });
        
        (其中,
        filterResults
        ,当然,使用输入值过滤结果)

      • 数据
        元素上调用
        toLowerCase
        ,只需提前调用一次,而不是在循环中的每次迭代或每次输入更改之后:

        const data = [/* your data */];
        const lowerData = data.map(str => str.toLowerCase());
        // then use `lowerData` instead
        
      • 预先对循环外部的输入字符串调用
        toLowerCase
        .split
        ,而不是每次迭代

      • 客户端不适合处理大量数据,尤其是在低端手机上。表现不佳。对于大量的数据,请考虑做过滤服务器端。
      • 如果您别无选择,只能在客户端执行此操作,请在单独的Web Worker中执行计算,以便页面的主UI在运行时保持响应


        • 我想你可以看看这些算法。您可以尝试使它们适应此问题,甚至适应您可能遇到的其他字符串问题


            • 我想你可以看看这些算法。您可以尝试使它们适应此问题,甚至适应您可能遇到的其他字符串问题


              一个快速更改是将拆分结果保存到变量中,而不是每次迭代都执行一个快速更改是将拆分结果保存到变量中,而不是每次迭代都执行一个快速更改可以通过添加debounce函数向我显示代码。或者,只是一个建议,您可以使搜索异步。如果答案满足您的需要,请确保将其标记为正确!是否有任何示例博客文章可以在单独的web worker中发布@CertainPerformance@htoniv在单个脚本文件中:使用多个脚本文件:是否可以向我显示添加debounce函数的代码。或者,只是一个建议,您可以使搜索异步。如果答案满足您的需要,请确保将其标记为正确!是否有任何示例博客文章可以在单独的web worker中发布@CertainPerformance@htoniv在单个脚本文件中:使用多个脚本文件:是的,我一定会尝试感谢是的,我一定会尝试感谢