如何获取字符串数组并对其进行筛选

How do I take an array of strings and filter them?

本文关键字:筛选 数组 字符串 何获取 获取      更新时间:2023-09-26

我在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数组?在这种情况下,它会过滤掉"Sally在塔可钟工作",并保留其余部分

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

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("<td><img src='"images/delete.png'" class='"delete_filter'" /> " + id + "</td>");
    }
}
);
$(".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对象并打印结果。工作完美无瑕。现在我想给用户一个选项来过滤传入的尾随项目。用户单击过滤器按钮,jQuery获取过滤器文本并将其添加到keywords数组中,然后使用keywords数组过滤JSON对象中的data.log,然后将其附加到屏幕上。

我还有一个不起作用的删除过滤器功能。也许有人能帮我。

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

没有jQuery:

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

jQuery对"过滤器"的定义是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) })
var filtered = [];
var re = new RegExp(keywords.join('|'));
for (var i=0; i<arr.length; i++) {
    if (re.search(arr[i])) {
        filtered.append(arr[i]);
    }
}

更新

由于从jQuery的角度来看,这里有更好的答案,所以我将我的答案修改为普通的JavaScript方法,只适用于那些可能需要在没有jQuery的情况下这样做的人。

头顶,未经测试。作为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);

您可以使用[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强大的功能:

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/