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

use lodash to find substring from array of strings

我正在学习 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 found = myArray.filter(function(el){
  return el.indexOf('oranges') > -1;
}).length;

if (found) { // oranges was found }

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

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

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

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

干杯!

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

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

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

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

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

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

更新:

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

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

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

也有机会调查 ramda。该库为 JavaScript.

中的实用函数式编程提供了更好的方法
_.some(myArray, function(str){
    return _.includes(str, 'orange')
})

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

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

unary() function ensures that only one argument is passed to the callback. The partialRight() function is used to apply the 'orange' value as the second argument to includes()some().

的每次迭代都会提供第一个参数

但是,如果区分大小写很重要,则此方法将不起作用。例如,'Orange' 将 return 为假。以下是处理区分大小写的方法:

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

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

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

_.some(myArray, _.method('includes', 'orange'));
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

我 运行 进入这个问题/答案线程,同时试图找出如何 将子字符串与数组中的每个字符串匹配并删除包含该子字符串的任何数组项.

虽然以上答案让我步入正轨,虽然这并没有具体回答原始问题,但当您试图弄清楚如何完成上面删除了一个数组项,所以我想我会 post 在这里回答。

我最终找到了一种使用 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是匹配子串在字符串中的位置,如果没有找到子串会return-1,当indexOfreturns不是-1的时候( number 是 Array 字符串中字符数中的 SubString 位置)。

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