检查字符串是否包含JavaScript中数组的任何元素

时间:2016-05-25 05:15:31

标签: javascript arrays string

如何检查字符串是否包含数组的任何元素?如果元素有一些字符串,我想过滤一些数组。请参阅下面的代码。



var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange'];

function checker(value) {
  var prohibited = ['banana', 'apple'];

  for (var i = 0; i < prohibited.length; i++) {
    if (value.indexOf(prohibited[i]) == -1) {
      return true;
    } else {
      return false;
    }
  }
}

arr = arr.filter(checker);
console.log(arr);
&#13;
&#13;
&#13;

结果是[ 'apple', 'kiwi', 'orange' ]'apple'应该被移除,但它不是。

以上代码仅过滤&#39; banana&#39;不是&#39; apple&#39;。我有很多关键字要过滤。有更简单的方法吗?

7 个答案:

答案 0 :(得分:21)

可以这么简单:

const arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange'];

const checker = value =>
  !['banana', 'apple'].some(element => value.includes(element));

console.log(arr.filter(checker));

ECMAScript 6 FTW!

checker使用an arrow function

!表示它将排除所有不符合条件的元素。

  

some() 方法测试数组中的某个元素是否通过了由提供的函数实现的测试。

来自Array.prototype.some() docs on MDM

  

includes() 方法确定是否可以在另一个字符串中找到一个字符串,并根据需要返回truefalse

来自String.prototype.includes() docs on MDM

由于并非所有浏览器都支持某些最新的ECMAScript功能,因此您应使用Babel将代码编译为ECMAScript 5.

答案 1 :(得分:16)

问题在于for循环,它只返回一次,因为返回结束了函数,切断了进程中的for循环。因此,您可以像这样更新代码,以便只在for循环完成后才返回该函数。

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange'];

function checker(value) {
  var prohibited = ['banana', 'apple'];

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

arr = arr.filter(checker);
console.log(arr);

为了减少功能,您可以使用 every() indexOf() 方法

  

'every'方法对数组中存在的每个元素执行一次提供的回调函数,直到找到一个回调返回伪值的值(转换为布尔值时变为false的值)。如果找到这样的元素,则every方法立即返回false。否则,如果回调为所有元素返回了一个true值,则每个元素都将返回true。仅为已分配值的数组的索引调用回调;对于已删除或从未分配过值的索引,不会调用它。( Taken from here

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange'];

function checker(value) {
  var prohibited = ['banana', 'apple'];
  return prohibited.every(function(v) {
    return value.indexOf(v) == -1;
  });
}

arr = arr.filter(checker);
console.log(arr);

旧浏览器check polyfill option of every method

你甚至可以在这里使用正则表达式。使用数组生成正则表达式并使用 test() 来检查匹配

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange'];

function checker(value) {
  var prohibited = ['banana', 'apple'];
  var regex = new RegExp(prohibited.map(function(s) {
    return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
  }).join('|'));
  return !regex.test(value);
}

arr = arr.filter(checker);
console.log(arr);

请参阅此答案以获取字符串到正则表达式转换:Can you create JavaScript regexes on the fly using string variables?

答案 2 :(得分:2)

我认为这可以大大简化。 javascript中已经内置了用于检查这些内容的内容。考虑:

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange'];

function checker(value) {
  var prohibited = ['banana', 'apple'];

  // indexOf() returns -1 if the element doesn't exist in the prohibited array
  return prohibited.indexOf( value ) == -1;
}

arr = arr.filter(checker);
console.log(arr);

答案 3 :(得分:2)

对于正在寻找简单,单线的人:

arr.filter(item => !prohibited.some(prohb => item.includes(prohb)))  // ["kiwi", "orange"]

答案 4 :(得分:2)

您可以使用 some() function: 检查字符串是否包含数组的任何元素。

例如

var fruitsArr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange'];
var myString = "I have an apple and a watermelon.";
var stringIncludesFruit = fruitsArr.some(fruit => myString.includes(fruit));

这个功能很新。 some() 方法接受一个回调,您可以在其中定义要验证的条件并返回一个布尔值。查看上面链接中的文档。

答案 5 :(得分:0)

例如,通过构建一个RegExp并对其进行测试:

var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange'];
var prohibited = ['banana', 'apple'];

var escapeForRegex = function(str) {
  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
};

var r = new RegExp(prohibited.map(escapeForRegex).join("|"));
arr.filter(function(v){ return !r.test(v) });

答案 6 :(得分:0)

有些人可能会认为这是一个有问题的做法,但是您可能会发现拥有一种可以直接在字符串上运行的方法很有用-在这种情况下,您可以使用{{3 }}。

赞...

String.prototype.containsAny = String.prototype.containsAny || function(arr) {
  for (var i = 0; i < arr.length; i++) {
    if (this.indexOf(arr[i]) > -1) {
      return true;
    }
  }
  return false;
};

如本例所示,它将默认为containsAny方法的任何现有定义。请记住:无论何时您要扩充内置对象,最好至少首先检查该属性的存在是一个好主意-也许某天它会存在... ¯\ _(ツ)_ /¯

查看String的用法或参见下文

var str = 'This is a sentence as a string.';

console.log(str.containsAny(['string1', 'string2', 'string3'])); // -> returns false
console.log(str.containsAny(['string', 'string1', 'string2'])); // -> returns true
<script src="//cdn.simpledigital.net/common/js/extensions/String.prototypeHelpers.js"></script>