2010-05-17 3 views
10

Как я могу вернуть только объекты в массиве, которые удовлетворяют определенным критериям с помощью javascript?Выбор объектов в массиве на основе соответствия регулярных выражений

Например, если у меня есть ['apple', 'avocado', 'banana', 'cherry'], и вы хотите только выводить фрукты, которые начинаются с буквы «A».

EDIT:

принял функцию Шона Кинси ниже, и пытался сделать его более гибким путем передачи массива и письма, чтобы соответствовать:

функция filterABC (обр, ABC) {

var arr = arr; 

var filtered = (function(){ 
    var filtered = [], i = arr.length; 
while (i--) { 
    if ('/^' + abc + '/'.test(arr[i])) { 
    filtered.push(arr[i]); 
    } 
} 
return filtered; 
})(); 

return filtered.join(); 

}

Попытка вызвать его с помощью filterABC (arr, 'A') или filterABC (arr, 'A | B | C |') для вывода всех совпадений от A до C, но имеющих проблемы с этой частью.

+0

ли вам на самом деле средние объекты в массиве, или вы просто означают строки в массив? –

+0

Помог ли мой обновленный ответ решить вашу проблему? –

ответ

14

Если таргетинг ES3 (версия JavaScript, который является наиболее распространенным и безопасным для использования), а затем использовать

var arr = ['apple','avocado','banana','cherry']; 

var filtered = (function(){ 
    var filtered = [], i = arr.length; 
    while (i--) { 
     if (/^A/.test(arr[i])) { 
      filtered.push(arr[i]); 
     } 
    } 
    return filtered; 
})(); 
alert(filtered.join()); 

Но если вы ориентируетесь ES5, то вы можете сделать это с помощью

var filtered = arr.filter(function(item){ 
    return /^A/.test(item); 
}); 
alert(filtered.join()); 

Если вы хотите, то можете включать в себя метод ES5 фильтра в ES3 с помощью

if (!Array.prototype.filter) { 
    Array.prototype.filter = function(fun /*, thisp*/){ 
     var len = this.length >>> 0; 
     if (typeof fun != "function") 
      throw new TypeError(); 

     var res = []; 
     var thisp = arguments[1]; 
     for (var i = 0; i < len; i++) { 
      if (i in this) { 
       var val = this[i]; // in case fun mutates this 
       if (fun.call(thisp, val, i, this)) 
        res.push(val); 
      } 
     } 

     return res; 
    }; 
} 

См https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Array/filter#Compatibility для больше.

UPDATE Ответ на обновленный вопрос

var filtered = (function(pattern){ 
    var filtered = [], i = arr.length, re = new RegExp('^' + pattern); 
    while (i--) { 
     if (re.test(arr[i])) { 
      filtered.push(arr[i]); 
     } 
    } 
    return filtered; 
})('A'); // A is the pattern 

alert(filtered.join()); 
+0

Спасибо! Код работает отлично, я просто пытаюсь сделать его немного более гибким, превратив его в функцию, в которой я могу передать массив и букву. Я могу передать в массиве просто отлично, но у меня есть некоторые проблемы с передачей в параметре letter в часть regext (см. Мое редактирование выше). – Choy

+0

Вам нужно использовать класс RegExp при создании регулярных выражений, подобных этому 'RegExp ('^' + abc) .test (... ' –

+0

7 лет спустя первая строка ответа заставляет меня смеяться :-) –

0

Ваша проблема с генерируете регулярное выражение на лету. Вы не можете создать правильное регулярное выражение, объединив строки. Вы должны использовать конструктор: RegExp(), чтобы создать регулярное выражение из строки.

Вот моя функция для согласования массива:

function matcharray(regexp, array) { 
     var filtered = []; 
     for (i = 0; i < array.length; i++) { 
      if (regexp.test(array[i])) { 
       filtered.push(array[i]); 
      } 
     } 
     return filtered; 
    } 

Вы могли бы назвать эту функцию следующим образом:

var myregex = "abc"; 
alert(matcharray(new RegExp(myregex), my_array).join()); 
Смежные вопросы