【问题标题】:Match one of the elements of an array in a string using javascript使用javascript匹配字符串中的数组元素之一
【发布时间】:2016-08-08 20:53:18
【问题描述】:

我正在尝试创建一个函数,如果在另一个字符串中找到至少一个字符串数组的元素,则该函数返回 true。

function findInString(str) {
    var fruits = ["orange", "banana", "grape"];

    for(var i = 0; i < fruits.length; i++) {
        if (str.indexOf(fruits[i]) > -1) {
            return true;
        }
    }

    return false;
}

var a = findInString("I love orange juice."); //=> returns true
var b = findInString("I don't like peach."); //=> returns false

这个函数可以解决问题,但我确信可能有一些数组或字符串方法可以做同样的事情,而不必遍历数组。有什么想法吗?

谢谢。

【问题讨论】:

  • 如果你在这里没有得到答案,你可以考虑在codereview.stackexchange.com发帖
  • 代码审查可能想看看实际代码是什么。这看起来真的像是示例代码,要求以不同的方式来做同样的事情(即特定的编程问题),这更适合 Stack Overflow。
  • 必须以某种方式遍历整个数组,否则解决方案将不完整。
  • 如果没有找到,你只需要遍历整个数组。
  • 注意我对这个挑战很感兴趣,并做了一些有限的测试。在我非常有限的测试中,在大约 100 个阈值点之后,将字符串拆分为一个数组并比较两个数组实际上更快。因此,在您多次处理相同的字符串之前,您当前的选项会更快。

标签: javascript arrays search


【解决方案1】:

从概念上讲,我想不出更好(甚至不同)的方法来做到这一点。我不知道执行此任务的内置函数,但即使有一个它的实现也将是这样的。

【讨论】:

  • 到目前为止,这是最好的答案......我想要一些东西来让我所做的事情变得更简单,而我得到的答案让它变得更复杂:)
【解决方案2】:

您可以使用与此非常接近的some。我是这样写的:

function find (str, arr) {
  return arr.some((s) => s.indexOf(str) > -1); 
}

如果你愿意,你也可以这样做,但我觉得不太好。

function find (str, arr) {
  return arr.join(',').indexOf(str) > -1
}

【讨论】:

    【解决方案3】:

    我喜欢你这样做的方式。我对此有所了解,您可以考虑以下几种方法:

    其中一些非常接近,但最后一段可能需要一些字符串解析来处理每种情况。注意最后一个,因为它使用 RegExp,不需要对字符串做任何事情:

    JsBin Example

    function findInString(str) {
      var fruits = ["orange", "banana", "grape"];
    
      return str.split(' ').filter(function(el) {
        return fruits.indexOf(el) > -1;
      }).length > 0;
    }
    
    function finderWithReduce(str) {
      var fruits = ["orange", "banana", "grape"];
      var result = false;
      str.split(' ').reduce(function(a, b) {
        if (a.indexOf(b) > -1) {
          result = true;
        }
        return a;
      }, fruits);
      return result;
    }
    
    function finderWithForEach(str){
      var fruits = ["orange", "banana", "grape"];
      var result = false;
      fruits.forEach(function(fruit) {
        if (str.indexOf(fruit) > -1) {
          result = true;
        }
      });
      return result;
    }
    
    function finderWithRegex(str) {
      var fruits = ["orange", "banana", "grape"];
      for (var i = 0; i < fruits.length; i++) {
        var re = new RegExp(fruits[i], 'gi');
        if (str.match(re) !== null) {
          return true;
        }
      }
      return false;
    }
    

    【讨论】:

      【解决方案4】:

      你可以使用some函数。

      function findInString(str, arr) {
         return arr.some(function(el) {
            return str.indexOf(el) > -1;
         });
      }
      
      var fruits = ["orange", "banana", "grape"];
      
      var a = findInString("I love orange juice.", fruits); //=> returns true
      var b = findInString("I don't like peach.", fruits); //=> returns false
      

      【讨论】:

        【解决方案5】:

        我认为您确实必须处理数组。我会做出两个改变。

        首先我会传入数组和字符串,创建一个通用函数,然后我会重新编写它,以便一旦找到它就退出执行并退出循环;与 return true 类似的概念,但只是一种不同的方式 - 我个人偏好只有一个函数退出。

        function findInString(arr, str) {
          var hasString = false;
          for (var i = 0; i < fruits.length; i++) {
            if (str.indexOf(fruits[i]) > -1) {
              hasString = true;
              break;
            }
          }
          return hasString;
        }
        
        var fruits = ["orange", "banana", "grape"];
        
        var a = findInString(fruits, "I love orange juice."); //=> returns true
        var b = findInString(fruits, "I don't like peach."); //=> returns false
        

        【讨论】:

          【解决方案6】:

          这是一个函数式 ES6 方法。 presentIn 是一个高阶函数,它接受一个字符串并返回一个充当some 回调的函数。

          const presentIn = (str) => (el) => str.includes(el);
          
          fruits.some(presentIn('I love orange juice.')); // true
          fruits.some(presentIn('I don\'t like peach.')); // false
          

          我真的很喜欢这种方法,因为您直接在数组元素上进行操作,如果您将函数命名好,它会出色地扫描:“数组的某些元素是否存在于字符串中”。

          DEMO

          比较详细的 ES5 版本:

          function presentIn(str) {
            return function (el) {
              return str.indexOf(el) > -1;
            }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-02-23
            • 1970-01-01
            • 1970-01-01
            • 2018-09-30
            • 1970-01-01
            • 2015-01-10
            • 1970-01-01
            • 2020-04-04
            相关资源
            最近更新 更多