如何在jQuery中实现"OR"逻辑而不是"AND"?



我正试图修改一个插件,以便它可以与组内的"OR"逻辑和组之间的" and "逻辑一起工作。这是一个很好的例子。我的代码看起来像:

if ($.inArray(tag, itemTags) > -1) {
   return true;
}

如果我在tag中有["One","Two"]如何实现它的OR逻辑。

我已经更新了你的小提琴,我认为这是你所需要的功能。

我只是稍微移动了一下逻辑。

如果您的目标浏览器提供array.filter,您可以这样做:

var matchingTags = itemTags.filter(function(el) { 
                       return $.inArray(el, tag) > -1;
                   });

查看效果

使用ES5的.some方法,这可以相当简洁。

var tag = ["d", "b"],
    tagItems = ["a", "b", "c", "d", "e"];
var contains = tagItems.some(function(v) { // whether at least "d" or "b" is in `tagItems`
    return ~tag.indexOf(v);
});
if(contains) {
    // ...

这个tagItems的行为如下:

tag = ["d", "b"];        // contains === true (due to "d")
tag = ["foo", "x", "a"]; // contains === true (due to "a")
tag = ["bar"];           // contains === false (due to no matches)

您也可以为此创建一个辅助函数:

$.inArrayMultiple = function(subset, arr) {
    return arr.some(function(v) {
        return ~subset.indexOf(v);
    });
};

然后你可以使用:

if($.inArrayMultiple(tag, itemTags)) {
    // ...

一个迂回的解决方案是将inArray条件包装在$(array).each()函数中,如果数组中存在任何迭代项,则返回true。

var result = function ()
{
    var r = false;
    $(tag).each(function()
    {
        if ($.inArray(this, itemTags) > -1) 
        {
           r = true;
        }
    });
    return r;
}

最新更新