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

Javascript 使用lodash从字符串数组中查找子字符串,javascript,arrays,include,lodash,Javascript,Arrays,Include,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,但是它们都失败

我在学洛达斯。是否可以使用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,但是它们都失败了,因为它们查看的是完整的字符串,而不是子字符串

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

var found = myArray.join(',').indexOf('oranges') > -1;
if (found) { // oranges was found }

您可以使用lodash实现这一点,但使用本机javascript方法也非常可行:

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

  return array.some(contains);
}
测试上述功能:

var a = ['hello', 'there'];
var b = ['see', 'ya', 'later'];

stringArrayContains(a, 'ell') // true
stringArrayContains(a, 'what') // false
stringArrayContains(b, 'later') // true
stringArrayContains(b, 'hello') // false
有些应用程序将定义的函数应用于数组的每个元素。此函数(在本例中命名为contains)必须返回true或false。在遍历数组元素时,如果任何元素返回true,some方法将返回true

我个人认为,一般来说,如果可以对简单函数使用本机JS方法,那么最好加载一个库来完成同样的任务。Lodash绝对有性能优势,但除非处理大量数据,否则不一定能实现这些优势。只要我的两分钱


干杯

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

var contains = _.curry(function (substring, source) {
    return source.indexOf(substring) !== -1;
});
我在这里使用
\ curry
获得一个curry函数,该函数可以部分应用

_.some(myArray, contains('item'));
还可以在连接的字符串中找到子字符串

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

我没有注意到lodash已经具备了在收藏中发现价值的功能

函数
\uux.includes
与我上面定义的完全相同。然而,与lodash中的所有内容一样,它对参数使用不同的顺序。在我的示例中,我将一个源作为curried函数的最新参数,这使我的函数在lodash等待源作为同一函数的第一个参数时,对于无点编程非常有用

看看Brian Lonsdorf关于这件事的谈话


也可以借此机会调查一下。该库为JavaScript中的实用函数编程提供了一种更好的方法。

您可以轻松构建一个迭代器,以使用lodash的高阶函数。例如:

_.some(myArray, function(str){
    return _.includes(str, 'orange')
})
_.some(myArray, _.unary(_.partialRight(_.includes, 'orange')));
该函数确保只向回调传递一个参数。该函数用于将
'orange'
值作为第二个参数应用于。第一个参数随
some()
的每次迭代一起提供

然而,如果区分大小写很重要,这种方法就不起作用。例如,
'Orange'
将返回false。以下是处理区分大小写的方法:

_.some(myArray, _.method('match', /Orange/i));
该函数创建一个函数,该函数将调用传递给它的第一个参数的给定方法。这里,我们匹配一个不区分大小写的正则表达式

或者,如果区分大小写无关紧要,而您只是喜欢
method()
方法,那么这也适用于ES2015:

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

我在尝试找出如何将子字符串与数组中的每个字符串进行匹配并删除包含该子字符串的任何数组项时遇到了这个问答线程

虽然上面的答案让我走上了正轨,虽然这并没有明确回答最初的问题,但当你试图找出如何完成上述删除数组项的过程时,这个线程确实会首先出现在google搜索中,所以我想我会在这里发布一个答案

我最终找到了一种使用Lodash的z.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(该数字是数组字符串中字符数的子字符串位置)


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

能否将数组加入字符串并使用indexOf?谢谢。这些很有效。如果没有人澄清lodash方法,我会将你的答案标记为正确。最后一种方法在大多数情况下都很好,即使在旧的浏览器中也可以使用。无需使用
过滤器
一些
。感谢您使用u.curry的技巧,因为我正在尝试学习“lodash方法”,非常感谢您对几个函数的精彩解释。与Alexander Yatkevich有用的u.curry实现相比,我更喜欢这些示例,因为u.method不需要创建单独的自定义函数。我注意到了一个不区分大小写示例的小查询。如果单词‘Orange’是一个变量(可以是任何单词),那么在传入之前我们是否必须对其进行转义?i、 类似这样的东西(未经测试)
var myWord='Orange'389;。一些(myArray,u.method('match',newregexp(u.escapeRegExp(myWord),“i”)
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
        // 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;
            });