【问题标题】:Select Objects in Array Based on Regex Match根据正则表达式匹配选择数组中的对象
【发布时间】:2010-05-17 19:41:02
【问题描述】:

如何使用 javascript 仅返回数组中满足特定条件的对象?

例如,如果我有 ['apple','avocado','banana','cherry'] 并且只想输出以字母 'A' 开头的水果。

编辑:

取下面肖恩金赛的函数,并尝试通过传入数组和字母来使其更灵活:

函数 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 的所有匹配项,但是这部分有问题。

【问题讨论】:

  • 你真的是指数组中的对象,还是仅仅指数组中的字符串?
  • 我更新的答案解决了你的问题吗?

标签: javascript arrays


【解决方案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 了解更多信息。

更新 回答更新的问题

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

【讨论】:

  • 谢谢!代码效果很好,我只是想通过将其转换为可以传入数组和字母的函数来使其更加灵活。我可以很好地传递数组,但是在将字母参数传递到正则部分时遇到了一些麻烦(请参阅上面的编辑)
  • 在构建这样的正则表达式时需要使用 RegExp 类 `RegExp('^' + abc).test(...`
  • 7 年后答案的第一行让我笑了:-)
【解决方案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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多