【问题标题】:jQuery Javascript array 'contains' functionality?jQuery Javascript 数组“包含”功能?
【发布时间】:2010-04-06 22:00:00
【问题描述】:

我正在尝试使用 jQuery $.inArray 函数来遍历数组,如果有一个元素的文本 contains 具有特定关键字,请删除该元素。 $.inArray 只返回数组索引,但如果元素的文本是 equal 到关键字。

例如给定以下名为 'tokens' 的数组:

-   tokens  {...}   Object
    [0] "Starbucks^25^http://somelink"  String
    [1] "McDonalds^34^" String
    [2] "BurgerKing^31^https://www.somewhere.com"   String

调用removeElement(tokens, 'McDonalds'); 将返回以下数组:

 -  tokens  {...}   Object
    [0] "Starbucks^25^http://somelink"  String
    [1] "BurgerKing^31^https://www.somewhere.com"   String

我猜这可能使用 jQuery $.grep$.each 函数,或者 regex。但是,我对 jQuery 还不够熟悉,无法做到这一点。

任何帮助将不胜感激!

【问题讨论】:

    标签: javascript jquery regex arrays


    【解决方案1】:

    grep 确实是要走的路。

    function removeElement(array, keyword) {
        return $.grep(array, function (item, i) {
          return item.indexOf(keyword) > -1;
      }, true);
    }
    

    这会将关键字作为子字符串查找。如果数组的元素具有特定格式(它们看起来是这样,但没有明确说明),请更改测试以匹配格式。

    function removeElement(array, keyword) {
        var keyRE=new RegExp('^'+keyword+'^');
        return $.grep(array, function (item, i) {
          return keyRE.test(item);
      }, true);
    }
    

    注意第一个'^'是匹配字符串开头的元字符;第二个只是匹配一个 '^' 字符。

    【讨论】:

    • 我认为他希望结果数组只包含没有有关键字的东西。
    • Pointy 说得对。虽然如果您创建的第一个 removeElement 函数返回数组索引而不是元素,那也可以吗?
    • @YourMomzThaBomb:在第一个版本(实际上,两者)中,数组索引被忽略。 a.indexOf(b) 返回字符串 b 在字符串 a 中的起始索引,如果 b 不是 a 的子字符串,则返回 -1。
    【解决方案2】:

    这应该是很清楚的。从 tokens 参数中删除包含在 search 参数中传入的字符串的所有元素。使用filter()

    function removeElement(tokens, search) {
        var regex = new RegExp(search);
        return $(tokens).filter(function() {
            return !regex.test(this);
        }).toArray();
    }
    

    如果你愿意,你也可以为正则表达式指定标志

    例如

    var regex = new RegExp(search, "i");
    

    将删除包含忽略大小写的搜索字符串的所有元素


    $.grep版本代码

    function removeElement(tokens, search) {
        var regex = new RegExp(search);
        return $.grep(tokens, function(elem, ind) {
            return regex.test(elem);
        }, true);
    }
    

    【讨论】:

    • 为每次迭代构建一个新的 RegExp 实例似乎有点浪费。
    【解决方案3】:

    edit 哎呀,我完全误解了这个问题。

    $.grep 带有一个“反转”标志,所以你可以直接使用它:

    var pattern = /\bword\b/;
    var newArray = $.grep(oldArray, function(e) { return pattern.test(e); }, true);
    

    当然,现在想想,我可以省下 5 个字符:

    var newArray = $.grep(oldArray, function(e) { return !pattern.test(e); });
    

    【讨论】:

      猜你喜欢
      • 2013-09-23
      • 2016-03-13
      • 2011-06-12
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 2020-11-24
      • 2010-11-17
      • 2012-01-09
      相关资源
      最近更新 更多