views:

43

answers:

1

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'] and want to only output fruit that begin with the letter 'A'.

EDIT:

Took Sean Kinsey's function below and tried to make it more flexible by passing in the array and letter to match:

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

}

Trying to call it with filterABC(arr,'A') or filterABC(arr,'A|B|C|') to output all matches from A to C but having trouble with this part.

+3  A: 

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());
Sean Kinsey
Thanks! Code works great, I'm just trying to make it a bit more flexible by turning it into a function where I can pass in the array and letter. I can pass in the array just fine, but am having some trouble passing in the letter param into the regext part (see my edit above)
George
You need to use the RegExp class when building regexps like this ` RegExp('^' + abc).test(...`
Sean Kinsey