如何在jQuery数组中查找字符串的一部分

4
我一直在尝试在两个字符串数组中查找部分字符串,但没有成功:
我有array1 ['BA11'、'BA14'、'BA15']和array2 ['GL156'、'GL24'、'GL31']。
当我搜索字符串"BA11AB"、"BA15HB"或"GL156DC"的一部分时,希望返回true。
以下是我一直在使用但没有成功的代码:
if($.inArray(userinput, array1) !== -1) 
        {
            alert("Found in Array1!");
        }

if($.inArray(userinput, array2) !== -1) 
        {
            alert("Found! in Array2");
        }

感谢您,Nuno。

3
循环该数组并对每个字符串使用indexOf方法。 - elclanrs
你不想检查值是否在数组中,而是想检查该值是否在数组的某个值中。 - eithed
你可以使用JavaScript搜索函数 http://msdn.microsoft.com/en-us/library/ie/tbc7a78k(v=vs.94).aspx - AurA
5个回答

5
var found = false;
$.each(array, function(i, val) {
    if (val.indexOf(string) >= 0) {
        found = true;
        return false;
    }
});

运行良好,+1!我在这里准备了一个小的jsFiddle来尝试它。注意:我已经封装成一个方便的函数。 - Matt
1
@Maurice 不是 string.indexOf(val) 吗,因为 val 的长度总是相同的,而字符串的长度可以是可变的,val 可以是字符串的一部分,而不是反过来。 - Bunkerbuster

5
看到 OP 改变了他原来的问题:http://jsfiddle.net/c4qPX/2/ 是一个适用于他们两个的解决方案(如果我们在搜索的关键字数组或搜索的值数组中搜索,算法没有真正的区别)- 关键是要比较什么。
var array1 = ['BA11', 'BA14', 'BA15'];
var array2 = ['GL156', 'GL24', 'GL31'];
var search = 'GL156DC';

$.each([array1, array2], function(index, value){
    $.each(value, function(key, cell){
        if (search.indexOf(cell) !== -1)
            console.log('found in array '+index, cell);
    });
});

3
您可以创建一个简单的函数,并将其添加到Array原型中(以便可以在任何数组上调用),该函数搜索数组以查找子字符串匹配项:

JSFIDDLE

Array.prototype.containsSubString = function( text ){
    for ( var i = 0; i < this.length; ++i )
    {
        if ( this[i].toString().indexOf( text ) != -1 )
            return i;
    }
    return -1;
}

然后只需在您的数组上使用它:
var array1 = ['12345', '78273', '34784'],
    array2 = ['JJJJJ', 'ABCDEF', 'FFDDFF'];

if( array1.containsSubString( 234 ) !== -1) 
{
    alert("Found in Array1!");
}

if( array2.containsSubString( 'DD' ) !== -1) 
{
    alert("Found! in Array2");
}

编辑

如果你想查找一个数组中是否有一个元素是另一个字符串的子串,则:

JSFIDDLE

Array.prototype.hasSubStringOf = function( text ){
    for ( var i = 0; i < this.length; ++i )
    {
        if ( text.toString().indexOf( this[i].toString() ) != -1 )
            return i;
    }
    return -1;
}

var array3 = [ 'AB11' ];

if( array3.hasSubStringOf( 'AB11HA' ) !== -1) 
{
    alert("Array3 contains substring");
}

编辑2

只需将前面的两个函数结合起来:

JSFIDDLE

Array.prototype.containsSubStringOrHasSubstringOf = function( text ){
    for ( var i = 0; i < this.length; ++i )
    {
        if (    this[i].toString().indexOf( text.toString() ) != -1
             || text.toString().indexOf( this[i].toString() ) != -1 )
            return i;
    }
    return -1;
}

var testArrays = [
        ['BA11ABC', 'BAGL156DC14', 'BA15HC'],
        ['GL156DC', 'GL166DC', 'GL31BA11AB'],
        ['BA11', 'BA14', 'BA15'],
        ['GL156', 'GL24', 'GL31']
    ],
    testValues   = [ "BA11AB", "BA15HB", "GL156DC" ],
    results = [ 'Results:' ];

var test = function( str, arr ){
    var i = arr.containsSubStringOrHasSubstringOf( str );
    if ( i !== -1 )
        results.push( JSON.stringify( arr ) + ' matches ' + str + ' on ' + arr[i] );
    else
        results.push( JSON.stringify( arr ) + ' does not match ' + str );
};

for ( var i = 0; i < testArrays.length; ++i )
    for ( var j = 0; j < testValues.length; ++j )
        test( testValues[j], testArrays[i] );

alert( results.join('\n') );

你好,感谢回答。然而,如果用户输入一个值,比如“AB11HB”,而我在我的数组中有一个条目想要匹配它,比如“AB11”,那么它会返回false。 - Nuno Luz
这不是你在原帖中所要求的,而且你提供的所有示例都不是这样的。 - MT0
编辑添加 - 如果这不能满足您的需求,请明确说明您的要求并提供一组合适的测试数据和通过/失败的标准。 - MT0
谢谢您的回答,我所要求的是相同的事情。唯一的区别在于我想要比较的数据。这就是我遇到麻烦的地方,因为如果我比较一个大于数组中数据的字符串,即使字符串的一部分存在于数组中,它也总是返回false。 - Nuno Luz
编辑添加 - 合并前两种方法。 - MT0

1
尝试像这样:

尝试像这样

 return array1.toString().indexOf(userinput)!=-1;

如果逗号有问题,则:
 return array1.join('|').indexOf(userinput)!=-1;

使用空格,如果有任何问题出现。
return array1.join(' ').indexOf(userinput)!=-1;

1
一个不错的方法,但如果他搜索 345,7,它将在 array1 中被找到。 - eithed
2
任何“join”方法都注定会失败,因为我们不知道OP的数据。当然,你可以用神奇的字符将它们分开,希望它们不会出现。 - eithed
var array1 = [ 'A A', 'A,A', 'A|A' ]; 如果使用 userinput 的值为 'A A''A,A' 或者 'A|A',则每个测试之间可以跨越数组元素的边界进行匹配。 - MT0

0

我不确定你是否熟悉underscore js,但你可以使用类似这样的东西:

var array = ['JJJJJ', 'ABCDEF', 'FFDDFF'];
var search = "JJJ";
var found = _.some(array, function(value) {
    return value.indexOf(search)!=-1;
});

alert(found);

请查看fiddle

我已经看到了其他人的答案,我真的很喜欢toString()答案:array.toString().indexOf(search)!=-1


1
更新了jQuery fiddle以在找到字符串时停止。 - R. Oosterholt
你尝试了哪一个,下划线还是jQuery?而且什么没有起作用? - R. Oosterholt
是的,第二个方法可以工作,但我需要它能够找到部分匹配结果,例如如果用户输入“BA11HB”,它应该返回true,因为它与数组中的“BA11”部分相符。 - Nuno Luz
你可以使用 join('分隔符')(例如:array1.join('|'))来解决这个问题。第一种解决方案是十分可靠的(不需要担心选择正确的分隔符)。 - R. Oosterholt

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