lodash _.contains one of multiple values in string

前端 未结 3 2103
予麋鹿
予麋鹿 2021-02-13 02:17

Is there a way in lodash to check if a strings contains one of the values from an array?

For example:

var text = \'this is some sample text\';
var values         


        
相关标签:
3条回答
  • 2021-02-13 02:50

    No. But this is easy to implement using String.includes. You don't need lodash.

    Here is a simple function that does just this:

    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']));

    0 讨论(0)
  • 2021-02-13 03:04

    Use _.some and _.includes:

    _.some(values, (el) => _.includes(text, el));
    

    DEMO

    0 讨论(0)
  • 2021-02-13 03:09

    Another solution, probably more efficient than looking for every values, can be to create a regular expression from the values.

    While iterating through each possible values will imply multiple parsing of the text, with a regular expression, only one is sufficient.

    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']));

    Limitation This approach will fail for values containing one of the following characters: \ ^ $ * + ? . ( ) | { } [ ] (they are part of the regex syntax).

    If this is a possibility, you can use the following function (from sindresorhus's escape-string-regexp) to protect (escape) the relevant values:

    function escapeRegExp(str) {
      return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
    }
    

    However, if you need to call it for every possible values, it is possible that a combination of Array.prototype.some and String.prototype.includes becomes more efficient (see @Andy and my other answer).

    0 讨论(0)
提交回复
热议问题