Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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_Algorithm_Filter_Mootools - Fatal编程技术网

Javascript 数据过滤算法

Javascript 数据过滤算法,javascript,algorithm,filter,mootools,Javascript,Algorithm,Filter,Mootools,你能给我推荐一种过滤数据的算法吗 我正在使用javascript并试图编写一个过滤函数来过滤数据数组。我有一个数据数组和一个过滤器数组,因此为了对每个数据应用每个过滤器,我编写了2个for循环 foreach(data) { foreach(filter) { check data with filter } } 这不是正确的代码,但简而言之,我的函数所做的,问题是这需要大量的时间,有人能提出更好的方法吗 我使用的是Mootools库,数据数组是JSON数组 数据和过滤器的详

你能给我推荐一种过滤数据的算法吗

我正在使用javascript并试图编写一个过滤函数来过滤数据数组。我有一个数据数组和一个过滤器数组,因此为了对每个数据应用每个过滤器,我编写了2个for循环

foreach(data)
{
  foreach(filter)
  {
   check data with filter
  }
}
这不是正确的代码,但简而言之,我的函数所做的,问题是这需要大量的时间,有人能提出更好的方法吗

我使用的是Mootools库,数据数组是JSON数组

数据和过滤器的详细信息

数据是JSON数组,比如说用户,所以

data = [{"name" : "first", "email" :  "first@first", "age" : "20"}.
        {"name" : "second", "email" :  "second@second", "age" : "21"}
        {"name" : "third", "email" :  "third@third", "age" : "22"}]
过滤器数组基本上是针对不同数据字段的自定义类

alFilter[0] = filterName;
alFilter[1] = filterEmail;
alFilter[2] = filterAge;
因此,当我输入第一个for循环时,在上面的例子中,我得到一个JSON对象(第一行)。 当我输入第二个for循环(filters循环)时,我有一个filter类,它提取当前过滤器工作的确切字段,并用数据的适当字段检查过滤器

在我的例子中

foreach(data)
{
 foreach(filter)
{
  //loop one - filter name
 // loop two - filter email
 // loop three - filter age
}
}

当第二个循环结束时,我设置了一个标志,指示数据是否已被过滤,并根据它显示数据。

您必须向我们提供有关数据和过滤器的确切结构的更多详细信息,才能真正帮助您。过滤器是用于选择数据子集还是用于修改数据?过滤器在做什么

尽管如此,还是有一些一般性的建议:

  • 少做些工作。是否有某种方法可以限制正在处理的数据量?一些预滤器,可以快速运行,并在您进行主循环之前将其减少
  • 尽快断开内部循环。如果其中一个过滤器拒绝一个基准,则中断内环并继续下一个基准。如果这是可能的,那么你也应该尝试让最有选择性的过滤器排在第一位。(假设您的筛选器用于拒绝列表中的项目,而不是修改它们)
  • 检查过滤器执行的计算中是否存在冗余。如果它们中的每一个都执行一些共享一些子例程的复杂计算,则可能或可能用于避免冗余计算

  • 事实上,这一切都归结为第一点,在代码的所有三个级别上做更少的工作。通过限制外循环中的项目,可以减少工作量吗?在一个特定的过滤器之后停止工作,然后先做最有选择性的过滤器,这样可以减少工作量吗?通过在每个过滤器内部不做任何冗余计算来减少工作量?

    这正是您应该做的。诀窍是优化“使用过滤器检查数据”部分。你需要遍历你所有的数据,并检查你所有的过滤器-你不会得到任何比这更快的

    避免字符串比较,尽可能使用本地数据模型,尝试使用
    过滤器减少每次传递的数据集,等等


    如果没有进一步的知识,您很难对其进行优化。

    您应该对过滤器的应用程序进行排序,以便优化两件事:昂贵的检查应该排在最后,消除大量数据的检查应该排在第一位。然后,您应该确保在出现“out”结果时立即停止检查。

    假设一个过滤器在数据不匹配时删除数据,我建议您这样切换两个循环:

    foreach(filter) {
        foreach(data) {
            check data with filter
        }
    }
    

    这样,第二个过滤器不必处理所有数据,而只处理通过第一个过滤器的数据,依此类推。当然,上面的提示(比如最后做昂贵的检查)仍然正确,应该另外考虑。

    如果您的过滤器正在查找特定的值、范围或文本的开头,那么jOrder()将适合您的问题

    您只需创建一个jOrder表,如下所示:

    var table = jOrder(data)
        .index('name', ['name'], { grouped: true, ordered: true })
        .index('email', ['email'])
        .index('age', ['age'], { grouped: true, ordered: true, type: jOrder.number });
    
    然后调用
    table.where()
    来筛选表

    当您查找精确匹配时:

    filtered = table.where([{name: 'first'}, {name: 'second'}]);
    
    当您查找某个字段的特定范围时:

    filtered = table.where([{age: {lower: 20, upper: 21}}], {mode: jOrder.range});
    
    或者,当您查找以给定字符串开头的值时:

    filtered = table.where([{name: 'fir'}], {mode: jOrder.startof});
    

    这种方法比嵌套循环的过滤速度快得多。

    应该可以工作。假设你有1000个用户。当第一个过滤器移除500个过滤器时,您将需要应用第二个过滤器,以此类推。