使用 lodash 从字符串数组中查找子字符串
Posted
技术标签:
【中文标题】使用 lodash 从字符串数组中查找子字符串【英文标题】:use lodash to find substring from array of strings 【发布时间】:2016-06-07 12:36:54 【问题描述】:我正在学习 lodash。是否可以使用 lodash 在字符串数组中查找子字符串?
var myArray = [
'I like oranges and apples',
'I hate banana and grapes',
'I find mango ok',
'another array item about fruit'
]
是否可以确认“橙子”一词是否在我的数组中? 我试过 _.includes, _.some, _.indexOf 但他们都失败了,因为他们查看的是完整的字符串,而不是子字符串
【问题讨论】:
你能把数组加入一个字符串并使用indexOf吗? 【参考方案1】:您可以使用 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'));
【讨论】:
几个功能的很好的解释,谢谢。比起 Alexander Yatkevich 对 _.curry 的有用实现,我更喜欢这些示例,因为 _.method 不需要创建单独的自定义函数。 我注意到一个不区分大小写示例的小查询。如果“Orange”这个词是一个变量(可以是任何词),我们是否必须在传递它之前对其进行转义?即类似这样的东西(未测试)var myWord = 'Orange'; _.some(myArray, _.method('match', new RegExp(_.escapeRegExp(myWord), "i")));
【参考方案2】:
两种快速的方法 - 都不使用 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 方式,我会将您的答案标记为正确。 最后一种方法适用于大多数情况,甚至在旧浏览器中也可以使用。不需要filter
或some
。【参考方案3】:
您可以使用 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)必须返回 true 或 false。在遍历数组元素时,如果任何元素返回 true,则 some 方法返回 true。
我个人认为,一般来说,如果你可以使用原生 JS 方法来实现简单的功能,那么最好加载一个库来做同样的事情。 Lodash 确实具有性能优势,但除非您处理大量数据,否则它们不一定会实现。只是我的两分钱。
干杯!
【讨论】:
【参考方案4】:最好的方法是定义一个函数来检查子串的包含情况。
var contains = _.curry(function (substring, source)
return source.indexOf(substring) !== -1;
);
我这里用_.curry
得到一个柯里化函数,然后可以部分应用。
_.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 中的实用函数式编程提供了一种更好的方法。
【讨论】:
感谢您使用 _.curry 的技术,因为我正在尝试学习“lodash 方法”【参考方案5】:我在试图弄清楚如何将子字符串与数组中的每个字符串匹配并删除包含该子字符串的任何数组项时遇到了这个问题/答案线程。
虽然上述答案让我走上了正轨,虽然这并没有具体回答原始问题,但当您试图弄清楚如何完成上述删除数组项时,此线程确实出现在谷歌搜索中所以我想我会在这里发布答案。
我最终找到了一种使用 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 是匹配字符串中子字符串的位置,如果没有找到子字符串,它将返回 -1,当 indexOf 返回一个不是 -1 的数字时(该数字是子字符串在字符数中的位置数组字符串)。
Lodash 通过数组突变删除该 Array 项,并且可以通过相同的名称访问新修改的数组。
【讨论】:
【参考方案6】:_.some(myArray, function(str)
return _.includes(str, 'orange')
)
【讨论】:
【参考方案7】: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
【讨论】:
以上是关于使用 lodash 从字符串数组中查找子字符串的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 中使用 LINQ 在字符串数组中查找确切的子字符串