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

Jun*_*tae 24 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);
Run Code Online (Sandbox Code Playgroud)

结果是[ 'apple', 'kiwi', 'orange' ].本'apple'应该得到去除,但事实并非如此.

上面的代码只过滤了'banana',而不是'apple'.我有很多关键字要过滤.有没有更简单的方法?

gho*_*end 32

您可以使用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));
Run Code Online (Sandbox Code Playgroud)

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

  • 这是我最喜欢的答案,因为写得很好而且更容易阅读。谢谢。 (3认同)

Mic*_*ski 26

它可以很简单:

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

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

console.log(arr.filter(checker));
Run Code Online (Sandbox Code Playgroud)

ECMAScript 6 FTW!

checker使用箭头功能.

!意味着它将排除所有不符合条件的元素.

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

来自Array.prototype.some()MDM的文档

includes()方法确定是否可以在另一个字符串中找到一个字符串,返回truefalse视情况而定.

来自String.prototype.includes()MDM的文档


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


Pra*_*lan 18

问题在于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);
Run Code Online (Sandbox Code Playgroud)


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

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

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);
Run Code Online (Sandbox Code Playgroud)


对于旧浏览器,请检查每种方法的polyfill选项.


你甚至可以在这里使用正则表达式.使用数组生成正则表达式并用于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);
Run Code Online (Sandbox Code Playgroud)

请参阅此答案以获取字符串到正则表达式转换:您可以使用字符串变量动态创建JavaScript正则表达式吗?


Lah*_*ori 5

对于寻找简单单线的人:

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