簡體   English   中英

使用javascript匹配字符串中數組的元素之一

[英]Match one of the elements of an array in a string using javascript

我正在嘗試創建一個函數,如果在另一個字符串中找到字符串數組的至少一個元素,則該函數返回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

該函數可以解決問題,但是我敢肯定,有些數組或字符串方法可以執行相同的操作而不必遍歷數組。 有任何想法嗎?

謝謝。

您可以使用some與此非常接近的東西。 這是我的寫法:

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

如果您願意,您也可以這樣做,但是我對此並不滿意。

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

我喜歡你的做事方式。 我對此有所了解,可以考慮以下幾種方法:

其中一些確實很接近,但是最后一個時期可能需要一些字符串解析來處理每種情況。 注意最后一個,因為它使用RegExp,所以不需要對字符串做任何事情:

JsBin示例

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;
}

您可以使用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

我認為您必須處理數組。 我將進行兩項更改。

首先,我將傳入數組和字符串,並創建一個泛型函數,然后對其進行重新處理,以便一旦找到一個,便退出該操作並退出循環。 與返回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

這是功能性的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

我真的很喜歡這種方法,因為您直接在數組元素上進行操作,並且如果您對函數命名得好,它會進行出色的掃描:“字符串中是否存在數組的某些元素”。

演示

比較詳細的ES5版本:

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

從概念上講,我無法想到一種更好(甚至不同)的方法。 我不知道執行此任務的內置函數,但是即使有一個函數,無論如何也要實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM