确定字符串是否在JavaScript中列表中
在SQL中,我们可以看到一个字符串是否在列表中,如下所示:
Column IN ('a', 'b', 'c')
在JavaScript中做这件事的好方法是什么? 这样做太笨拙了:
if (expression1 || expression2 || str === 'a' || str === 'b' || str === 'c') {
// do something
}
我不确定这个的性能或清晰度:
if (expression1 || expression2 || {a:1, b:1, c:1}[str]) {
// do something
}
或者可以使用开关功能:
var str = 'a',
flag = false;
switch (str) {
case 'a':
case 'b':
case 'c':
flag = true;
default:
}
if (expression1 || expression2 || flag) {
// do something
}
但这是一个可怕的混乱。 有任何想法吗?
在这种情况下,我必须使用Internet Explorer,因为它适用于企业内部网页面。 所以['a', 'b', 'c'].indexOf(str) !== -1
在没有语法糖的情况下将不会工作。
你可以调用indexOf
:
if (['a', 'b', 'c'].indexOf(str) >= 0) {
//do something
}
EcmaScript 6
如果您使用的是ES6,则可以构建这些项目的数组,并使用includes
:
['a', 'b', 'c'].includes('b')
没有阵列
你可以添加一个新的isInList
属性给字符串,如下所示:
if (!String.prototype.isInList) {
String.prototype.isInList = function() {
let value = this.valueOf();
for (let i = 0, l = arguments.length; i < l; i += 1) {
if (arguments[i] === value) return true;
}
return false;
}
}
然后像这样使用它:
'fox'.isInList('weasel', 'fox', 'stoat') // true
'fox'.isInList('weasel', 'stoat') // false
你可以为Number.prototype
做同样的事情。
indexf使用IE8和更早版本的Polyfill
除了ES6,你可以在大多数浏览器中使用indexOf
做同样的事情(IE8和更早的版本不是“大多数”的一部分)。
在这种情况下,我最终使用了indexOf()函数,并为Internet Explorer 7“推出了自己的”。
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(item) {
var i = this.length;
while (i--) {
if (this[i] === item) return i;
}
return -1;
}
}
不过,从长远来看,我不认为修改Array.prototype
是最好的答案。 在JavaScript中修改Object
和Array
原型可能导致严重的错误。 您需要决定在自己的环境中这样做是否安全。 主要注意的是迭代一个数组(当Array.prototype添加属性时)with for ... in
将返回新的函数名称作为键之一:
Array.prototype.blah = function() { console.log('blah'); };
for (var x in [1, 2, 3]) { console.log(x); }
// Result:
0
1
2
blah // Extra member iterated over
大多数答案都提出了Array.prototype.indexOf
方法,唯一的问题是它不能在IE9之前的任何IE版本上工作。
作为另一种选择,我给你留下了两个可用于所有浏览器的选项:
if (/Foo|Bar|Baz/.test(str)) {
// ...
}
if (str.match("Foo|Bar|Baz")) {
// ...
}
链接地址: http://www.djcxy.com/p/25667.html