使用lodash从字符串数组中查找子字符串

时间:2016-02-24 23:36:12

标签: javascript arrays include lodash

我正在学习lodash。是否可以使用lodash在字符串数组中查找子字符串?

    var myArray = [
    'I like oranges and apples',
    'I hate banana and grapes',
    'I find mango ok',
    'another array item about fruit'
    ]

是否可以确认“oranges”这个词是否在我的数组中? 我已经尝试了_.includes,_.some,_.indexOf,但是他们看到完整的字符串而不是子字符串时都失败了

7 个答案:

答案 0 :(得分:14)

您可以使用lodash的高阶函数轻松地为some()构建迭代。例如:

_.some(myArray, _.unary(_.partialRight(_.includes, 'orange')));

unary()函数确保只有一个参数传递给回调。 partialRight()函数用于将'orange'值作为第二个参数应用于includes()。每个迭代some()都会提供第一个参数。

然而,如果案例敏感性很重要,这种方法将无法运作。例如,'Orange'将返回false。以下是如何处理区分大小写的问题:

_.some(myArray, _.method('match', /Orange/i));

method()函数创建一个函数,该函数将调用传递给它的第一个参数的给定方法。在这里,我们将匹配不区分大小写的正则表达式。

或者,如果区分大小写并不重要,您只是更喜欢method()方法,那么这对ES2015也适用:

_.some(myArray, _.method('includes', 'orange'));

答案 1 :(得分:4)

两种快速方法 - 既不使用lodash(对不起)

Boolean

或正如我在评论中提到的那样:

var found = myArray.filter(function(el){
  return el.indexOf('oranges') > -1;
}).length;

if (found) { // oranges was found }

答案 2 :(得分:0)

您可以使用lodash执行此操作,但使用原生javascript方法也非常可行:

go func() { b <- 1 }()

select {
    // ...
}

测试上述功能:

function stringArrayContains(array, str) {
  function contains(el) {
    return (el.indexOf(str) !== -1) ? true : false;
  }

  return array.some(contains);
}

Array.prototype.some将您定义的函数应用于数组的每个元素。此函数(在我们的例子中名为 contains )必须返回true或false。迭代数组元素时,如果任何元素返回 true ,则 some 方法返回true。

就个人而言,我认为一般来说,如果你可以使用本机JS方法来实现简单的功能,那么加载一个库只是为了做同样的事情。 Lodash确实具有性能优势,但除非您处理大量数据,否则它们不一定能够实现。只是我的两分钱。

干杯!

答案 3 :(得分:0)

最好的方法是定义一个函数来检查包含子字符串。

var contains = _.curry(function (substring, source) {
    return source.indexOf(substring) !== -1;
});

我在这里使用_.curry得到一个curried函数,然后可以部分应用。

_.some(myArray, contains('item'));

您还可以在连接的字符串中找到子字符串。

contains('item', _.join(myArray))

<强> UPD:

我没有注意到lodash已经具有在集合中查找值的功能。

函数_.includes与我上面定义的完全相同。但是,作为lodash中的所有内容,它使用不同的参数顺序。在我的例子中,我将一个源作为curried函数的最新参数,当lodash等待源作为同一函数的第一个参数时,这使得我的函数对于无点样式编程很有用。

查看Brian Lonsdorf关于此事的讨论https://www.youtube.com/watch?v=m3svKOdZijA

还有机会研究ramda。该库为JavaScript中的实际函数编程提供了更好的方法。

答案 4 :(得分:0)

我试图找出如何匹配数组中每个字符串的子字符串并删除包含该子字符串的任何数组项时,遇到了这个问题/答案主题。

虽然上述答案让我走上正轨,虽然这并没有具体回答原始问题,但当您试图弄清楚如何完成上述删除操作时,此主题将首先出现在Google搜索中数组项目所以我想我会在这里发布答案。

我最终找到了一种方法来使用Lodash的_.remove函数来删除匹配的数组字符串,如下所示:

        // The String (SubString) we want to match against array (for dropping purposes)
        var searchSubString = "whatever" 

        // Remove all array items that contain the text "whatever"
        _.remove(my_array, function(searchSubString) {
              return n.indexOf(searchSubString) !== -1;
            });

基本上indexOf匹配字符串中子字符串的位置,如果未找到子字符串,则当indexOf返回-1以外的数字时,它将返回-1(该数字是字符数内的字符数的SubString位置数组字符串)。

Lodash通过数组突变删除该数组项,并且可以使用相同的名称访问新修改的数组。

答案 5 :(得分:-1)

_.some(myArray, function(str){
    return _.includes(str, 'orange')
})

答案 6 :(得分:-1)

let str1 = 'la rivière et le lapin sont dans le près';
let str2 = 'product of cooking class';
let str3 = 'another sentence to /^[analyse]/i with weird!$" chars@';

_.some(_.map(['rabbit','champs'], w => str1.includes(w)), Boolean), // false
_.some(_.map(['cook'],            w => str2.includes(w)), Boolean), // true
_.some(_.map(['analyse'],         w => str3.includes(w)), Boolean), // true