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