如何获取字符串数组并过滤它们?

我在jQuery中有一个字符串数组。 我有另一个关键字数组,我想用来过滤字符串数组。

我的两个数组:

var arr = new Array("Sally works at Taco Bell", "Tom drives a red car", "Tom is from Ohio", "Alex is from Ohio"); var keywords = new Array("Tom", "Ohio"); 

如何使用jQuery中的keywords数组过滤arr数组? 在这种情况下,它会过滤掉“莎莉在塔可钟工作”并保留其余部分。

以下是我正在使用的实际代码。

 var keywords= []; var interval = ""; var pointer = ''; var scroll = document.getElementById("tail_print"); $("#filter_button").click( function(){ var id = $("#filter_box").val(); if(id == "--Text--" || id == ""){ alert("Please enter text before searching."); }else{ keywords.push(id); $("#keywords-row").append(" " + id + ""); } } ); $(".delete_filter").click( function(){ ($(this)).remove(); } ); function startTail(){ clearInterval(interval); interval = setInterval( function(){ $.getJSON("ajax.php?function=tail&pointer=" + pointer + "&nocache=" + new Date(), function(data){ pointer = data.pointer; $("#tail_print").append(data.log); scroll.scrollTop = scroll.scrollHeight; }); }, 1000); } 

这样做的全部目的是允许用户过滤日志结果。 因此,用户执行启动startTail()$.getJSON()检索由PHP函数构建的JSON对象并打印结果。 工作完美无瑕。 现在我想让用户选择过滤传入的拖尾项目。 用户单击filter按钮,jQuery获取filter文本并将其添加到keywords数组,然后使用keywords数组过滤来自JSON对象的data.log ,然后将其附加到屏幕。

我还有一个无效的删除过滤function。 也许有人可以帮助我。

 $.grep( arr, $.proxy(/./.test, new RegExp(keywords.join("|")))); 

没有jQuery:

 arr.filter(/./.test.bind(new RegExp(keywords.join("|")))); 

jQuery的“filter”一词是grep

 var arr = ["Sally works at Taco Bell", "Tom drives a red car", "Tom is from Ohio", "Alex is from Ohio"]; var keywords = ["Tom", "Ohio"]; var regex = new RegExp(keywords.join("|")); result = $.grep(arr, function(s) { return s.match(regex) }) 

头顶,未经测试。 作为jQuery插件:

 (function($) { $.foo = function(needle, haystack) { return $.grep(haystack, function () { var words = this.split(' '), flag = false ; for(var i=0; i < words.length; i++) { flag = $.inArray(words[i], needle); if (flag) { break; } } return flag; }); }; })(jQuery); 

然后你可以(据说)运行那样:

 var bar = $.foo(keywords, arr); 
 var filtered = []; var re = new RegExp(keywords.join('|')); for (var i=0; i 

UPDATE

由于从jQuery的角度来看这里有更好的答案,我将我的答案修改为一个普通的JavaScript方法,仅适用于那些可能需要在没有jQuery的情况下执行此操作的人。

您可以使用[ filter][1]函数,但无论哪种方式,您都需要遍历两个数组。 您可以使用indexOf检查字符串是否包含在另一个字符串中。

 var arr = ["Sally works at Taco Bell", "Tom drives a red car", "Tom is from Ohio", "Alex is from Ohio"]; var keywords = ["Tom", "Ohio"]; var filtered = []; for(var i = 0; i < arr.length; i++) { for(var j = 0; j < keywords.length; j++) { if (arr[i].indexOf(keywords[j]) > -1) { filtered.push(arr[i]); break; } } } console.log(filtered); 

实例

使用jQuery很棒的function:

 var keywords = ["Tom", "Ohio"]; $(["Sally works at Taco Bell", "Tom drives a red car", "Tom is from Ohio", "Alex is from Ohio"]).filter(function(k, v) { return v.match("(" + keywords.join("|") + ")"); }); 
 var keywords = ['Tom', 'Ohio']; var arr = ['Sally works at Taco Bell', 'Tom drives a red car', 'Tom is from Ohio', 'Alex is from Ohio']; var matcher = new RegExp(keywords.join('|')); var newarr = []; $.each(arr, function(index, elem) { if (elem.match(matcher)) { newarr.push(elem); } }); console.log(newarr); 

小提琴: http : //jsfiddle.net/LQ92u/1/