Выбор объектов в массиве на основе соответствия регулярному выражению

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

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

EDIT:

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

function filterABC (arr, 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, но имеющих проблемы с этой частью.

Ответ 1

Если таргетинг на 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());

Если вы хотите включить в ES3 фильтр ES5, используя

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());

Ответ 2

Ваша проблема заключается в том, чтобы генерировать регулярное выражение "на лету". Вы не можете создать правильное регулярное выражение, объединив строки. Вы должны использовать конструктор: 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());