lodash _.contains 字符串中的多个值之一
lodash _.contains one of multiple values in string
lodash 中有没有一种方法可以检查字符串是否包含数组中的值之一?
例如:
var text = 'this is some sample text';
var values = ['sample', 'anything'];
_.contains(text, values); // should be true
var values = ['nope', 'no'];
_.contains(text, values); // should be false
没有。但这很容易使用 String.includes. You don't need lodash.
来实现
这是一个简单的函数,可以做到这一点:
function multiIncludes(text, values){
return values.some(function(val){
return text.includes(val);
});
}
document.write(multiIncludes('this is some sample text',
['sample', 'anything']));
document.write('<br />');
document.write(multiIncludes('this is some sample text',
['nope', 'anything']));
另一种可能比查找每个值更有效的解决方案是从值创建正则表达式。
虽然遍历每个可能的值将意味着对文本进行多次解析,但使用正则表达式,只需一个就足够了。
function multiIncludes(text, values){
var re = new RegExp(values.join('|'));
return re.test(text);
}
document.write(multiIncludes('this is some sample text',
['sample', 'anything']));
document.write('<br />');
document.write(multiIncludes('this is some sample text',
['nope', 'anything']));
限制
对于包含以下字符之一的值,此方法将失败:\ ^ $ * + ? . ( ) | { } [ ]
(它们是正则表达式语法的一部分)。
如果这是可能的,您可以使用以下函数(来自 sindresorhus 的 escape-string-regexp)来保护(转义)相关值:
function escapeRegExp(str) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\^$\|]/g, "\$&");
}
但是,如果您需要为每个可能的 values
调用它,Array.prototype.some
and String.prototype.includes
的组合可能会变得更有效(请参阅@Andy 和我的其他答案)。
使用_.some
and _.includes
:
var text = 'this is some sample text';
var values = ['sample', 'anything'];
console.log(_.some(values, (el) => _.includes(text, el)));
var values = ['no', 'nope'];
console.log(_.some(values, (el) => _.includes(text, el)));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
更现代的方法是使用原生 JS 来实现同样的事情,而不需要外部库。
const text = 'this is some sample text';
const values1 = ['sample', 'anything'];
const values2 = ['no', 'nope'];
function test(text, arr) {
return arr.some(el => {
return text.includes(el);
});
}
console.log(test(text, values1));
console.log(test(text, values2));
lodash 中有没有一种方法可以检查字符串是否包含数组中的值之一?
例如:
var text = 'this is some sample text';
var values = ['sample', 'anything'];
_.contains(text, values); // should be true
var values = ['nope', 'no'];
_.contains(text, values); // should be false
没有。但这很容易使用 String.includes. You don't need lodash.
来实现这是一个简单的函数,可以做到这一点:
function multiIncludes(text, values){
return values.some(function(val){
return text.includes(val);
});
}
document.write(multiIncludes('this is some sample text',
['sample', 'anything']));
document.write('<br />');
document.write(multiIncludes('this is some sample text',
['nope', 'anything']));
另一种可能比查找每个值更有效的解决方案是从值创建正则表达式。
虽然遍历每个可能的值将意味着对文本进行多次解析,但使用正则表达式,只需一个就足够了。
function multiIncludes(text, values){
var re = new RegExp(values.join('|'));
return re.test(text);
}
document.write(multiIncludes('this is some sample text',
['sample', 'anything']));
document.write('<br />');
document.write(multiIncludes('this is some sample text',
['nope', 'anything']));
限制
对于包含以下字符之一的值,此方法将失败:\ ^ $ * + ? . ( ) | { } [ ]
(它们是正则表达式语法的一部分)。
如果这是可能的,您可以使用以下函数(来自 sindresorhus 的 escape-string-regexp)来保护(转义)相关值:
function escapeRegExp(str) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\^$\|]/g, "\$&");
}
但是,如果您需要为每个可能的 values
调用它,Array.prototype.some
and String.prototype.includes
的组合可能会变得更有效(请参阅@Andy 和我的其他答案)。
使用_.some
and _.includes
:
var text = 'this is some sample text';
var values = ['sample', 'anything'];
console.log(_.some(values, (el) => _.includes(text, el)));
var values = ['no', 'nope'];
console.log(_.some(values, (el) => _.includes(text, el)));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
更现代的方法是使用原生 JS 来实现同样的事情,而不需要外部库。
const text = 'this is some sample text';
const values1 = ['sample', 'anything'];
const values2 = ['no', 'nope'];
function test(text, arr) {
return arr.some(el => {
return text.includes(el);
});
}
console.log(test(text, values1));
console.log(test(text, values2));