Select Objects in Array Based on Regex Match

前端 未结 2 721
粉色の甜心
粉色の甜心 2021-01-11 23:11

How can I return only the objects in an array that meet a certain criteria using javascript?

For instance, if I have [\'apple\',\'avocado\',\'banana\',\'cherry\'] an

相关标签:
2条回答
  • 2021-01-11 23:42

    If targeting ES3 (the version of javascript that is most common, and safe to use) then use

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

    But if you are targeting ES5 then you can do it using

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

    If you want to you can include the ES5 filter method in ES3 by using

    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;
        };
    }
    

    See https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Array/filter#Compatibility for more.

    UPDATE Answer for the updated question

    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 讨论(0)
  • 2021-01-11 23:54

    Your problem is with generating your regex on the fly. You cannot make a valid regex by concatenating strings. You have to use the constructor: RegExp() to make a regex from a string.

    Here is my function for matching an array:

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

    You could call this function like so:

    var myregex = "abc";
    alert(matcharray(new RegExp(myregex), my_array).join());
    
    0 讨论(0)
提交回复
热议问题