JavaScript indexOf - 在列表/数组中进行精确匹配

5
我决定使用javascript的indexOf方法来确定列表/数组中是否存在某个值。但是当我意识到我需要在列表中找到一个完全匹配的值时,这个方法就无法满足我的需求了。
下面是我的示例代码:
if (['eu', 'fr-CA', 'lt', 'sv', 'zh-CN', 'zh-TW'].indexOf('fr') > -1) {

上述代码将把“fr”匹配到“fr-CA”,这对我来说是个问题,因为我必须要精确匹配到“fr”而不是匹配到“fr-CA”。
我认为这应该很简单,但是我在Stack Overflow和Google上搜索了很久,没有找到如何精确匹配的答案。

3
等等,什么?你确定吗? - Ray Toal
['eu', 'fr-CA', 'lt', 'sv', 'zh-CN', 'zh-TW'].indexOf('fr') 返回 -1 - Arun P Johny
这是不可能的,这就是为什么你找不到答案。 - Sean
是的,我刚意识到。我需要去睡觉了。 - user1261774
4个回答

15

那是错误的,你可以使用indexOf:

arr.indexOf(searchElement[, fromIndex = 0])

indexOf会使用严格相等运算符(与===或三个等号相同的方法)将searchElementArray的元素进行比较。

所以['eu', 'fr-CA', 'lt', 'sv', 'zh-CN', 'zh-TW'].indexOf('fr')返回-1


2
哦,我的天!你是正确的。这是一个典型的例子,说明我不能仅靠每天两小时的睡眠生存下去。我是个蠢货。 - user1261774

5

试试这个:

var match = ['eu', 'fr-CA', 'lt', 'sv', 'zh-CN', 'zh-TW'].filter(function(item){
    return item === 'eu';
});

console.log(match); // an array of matches, only one item in this case

虽然你的代码应该能够正常运行,但是可能有其他遗漏的地方?

http://jsfiddle.net/ydm7k6xm/


你基本上已经实现了.indexOf()的行为:P - Ja͢ck
@Ja͢ck 呵呵,嗯,性能更好的一个更昂贵的版本... - filur
这个对我有用,indexOf() 似乎没有检查精确字符串,但这个函数可以。 - Kingston Fortune

3

当比较数组中的值是否等于数组中相同的值时,indexOf仅在相等时返回true,否则始终返回false。

如果要搜索数组值中的子字符串,请使用以下函数。它在数组中搜索子字符串并返回该位置。

function searchStringInArray (str, strArray) {
    for (var j=0; j<strArray.length; j++) {
        if (strArray[j].match(str)) return j;
    }
    return -1;
}

var res = searchStringInArray('fr',['eu', 'fr-CA', 'lt', 'sv', 'zh-CN', 'zh-TW']);

alert(res);

FIDDLE


3

你可以使用 some 方法。这个方法会在找到第一个匹配项后停止搜索,如果没有找到匹配项则返回 false:

var arr = ['eu', 'fr-CA', 'lt', 'sv', 'zh-CN', 'zh-TW'];
var match = arr.some(function(el) {
    return el === 'zh-CN';
});

alert(match);

正则表达式也可以被用来进行匹配。例如:

var arr = ['eu', 'fr-CA', 'lt', 'sv', 'zh-CN', 'zh-TW'];
var match = new RegExp('^' + arr.join('|') + '$').test('zh-CN');

alert(match);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接