How can I check if a string contains any element of an array? I want to filter some array if the element has some string. Please see below code.
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);
The result is [ 'apple', 'kiwi', 'orange' ]
. The 'apple'
should get removed, but it isn't.
Above code only filtered 'banana', not 'apple'. I have many keywords to filter. Is there an easier way?
To check if a string is contained in an array, call the indexOf method, passing it the string as a parameter. The indexOf method returns the index of the first occurrence of the string in the array, or -1 if the string is not contained in the array.
The indexof() method in Javascript is one of the most convenient ways to find out whether a value exists in an array or not. The indexof() method works on the phenomenon of index numbers. This method returns the index of the array if found and returns -1 otherwise.
The simplest and fastest way to check if an item is present in an array is by using the Array. indexOf() method. This method searches the array for the given item and returns its index. If no item is found, it returns -1.
It can be as simple as that:
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!
The checker
uses an arrow function.
The !
means that it will exclude all elements that doesn't meet the conditions.
The
some()
method tests whether some element in the array passes the test implemented by the provided function.
from Array.prototype.some()
docs on MDM
The
includes()
method determines whether one string may be found within another string, returningtrue
orfalse
as appropriate.
from String.prototype.includes()
docs on MDM
As some latest ECMAScript features aren't supported in all browsers, you should use Babel to compile your code to ECMAScript 5.
Problem lies in the for loop, which only iterates once since return ends the function, cutting off the for loop in the process. So, you can update the code like so to make the function only return once the for loop has been completed .
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);
For reducing the function you can use every()
and indexOf()
methods
The 'every' method executes the provided callback function once for each element present in the array until it finds one where callback returns a falsy value (a value that becomes false when converted to a Boolean). If such an element is found, the every method immediately returns false. Otherwise, if callback returned a true value for all elements, every will return true. callback is invoked only for indexes of the array which have assigned values; it is not invoked for indexes which have been deleted or which have never been assigned values.(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);
For older browser check polyfill option of every method.
You could even use a regex here. Generate regex using the array and use test()
to check match
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);
Refer this answer for string to regex conversion : Can you create JavaScript regexes on the fly using string variables?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With