Как мне взять массив строк и отфильтровать их? - PullRequest
5 голосов
/ 12 января 2012

У меня есть массив строк в 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");

Как я могу отфильтровать массив arr, используя массив keywords в jQuery?В этой ситуации он отфильтровывает «Салли работает в Taco Bell» и оставит все остальное.

Ниже приведен фактический код, который я использую.

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() извлекает объект JSON, созданный функцией PHP, и печатает результаты.Работает без нареканий.Теперь я хочу дать пользователю возможность фильтровать входящие элементы.Пользователь нажимает кнопку фильтра, и jQuery берет текст фильтра и добавляет его в массив keywords, затем data.log из объекта JSON фильтруется с использованием массива keywords и затем добавляется на экран.

У меня также есть функция удаления фильтра, которая не работает.Может быть, кто-то может помочь мне с этим.

Ответы [ 7 ]

8 голосов
/ 12 января 2012
$.grep( arr, $.proxy(/./.test, new RegExp(keywords.join("|"))));

без jQuery:

arr.filter(/./.test.bind(new RegExp(keywords.join("|"))));
4 голосов
/ 12 января 2012

Слово 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) })
2 голосов
/ 12 января 2012
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.

1 голос
/ 12 января 2012

Верх головы и непроверенный.Как плагин 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);
0 голосов
/ 12 января 2012
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/

0 голосов
/ 12 января 2012

Использование 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("|") + ")");
});
0 голосов
/ 12 января 2012

Вы можете использовать функцию [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);

Живой пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...