使用Underscorejs,如何查找一个数组是否包含另一个数组?

22

I have this

var matches = bookmarks.filter(function(x) {
    return _.contains(x.get("tags"), 'apple');
});

这将返回拥有苹果标签的书签对象。

我希望用一个数组代替此处,以获取所有具有匹配值的书签,类似于以下内容。

var matches = bookmarks.filter(function(x) {
    return _.contains(x.get("tags"), ['apple','orange']);
});

这个方法不起作用,有什么办法可以让它起作用吗?

编辑:对不起,书签是一个集合,我正在尝试返回具有苹果和橙子标记的模型。


无关的问题...你为什么要混合使用下划线和本地数组处理方法?Array.filter_.contains。难道不应该使用 _.filter 吗? - Ruan Mendes
@JosephSilber 啊,我不知道_(),虽然我还没有使用过下划线。 - Ruan Mendes
标题对我来说没有意义。 - 111
2个回答

26

如果tags是一个字符串,你的代码应该如下:

return _.indexOf(x.get("tags"), ['apple','orange']) > -1;

使用 indexOf 的示例:jsFiddle

如果tags是一个数组,您可以使用交集函数

return _.intersection(['apple','orange'], x.get("tags")).length > 0;

带交集的示例:jsFiddle


嗨,请查看一下修改,我忘记了一些细节。抱歉。 - user240993
是的,tags是一个数组,我正在尝试返回具有该数组中值的对象。 - user240993
1
我认为你可以只写 return _.intersection(['apple','orange'], x.get("tags")).length,不需要测试是否 > 0 - fadomire

5

在underscore中似乎没有这样的函数。但是,您可以轻松地结合其他函数来完成此操作:

_.mixin({
  containsAny: function(arr, values) {
    // at least one (.some) of the values should be in the array (.contains)
    return _.some(values, function(value) {
      return _.contains(arr, value);
    });
  }
});

嗨,请看一下编辑,我忘记了一些细节。抱歉。 - user240993

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接