如何检查字符串是否包含数组的任何元素?如果元素有一些字符串,我想过滤一些数组。请参阅下面的代码。
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;
结果是[ 'apple', 'kiwi', 'orange' ]
。 'apple'
应该被移除,但它不是。
以上代码仅过滤&#39; banana&#39;不是&#39; apple&#39;。我有很多关键字要过滤。有更简单的方法吗?
答案 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()
方法确定是否可以在另一个字符串中找到一个字符串,并根据需要返回true
或false
。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>