jquery .inarray的替代方案是什么?

4
我喜欢inarray的功能,可以在不循环的情况下搜索数组,但它只能进行精确匹配,如果我使用.match,就可以进行部分匹配,但这需要循环。
有没有一种方法可以在不循环的情况下搜索数组以进行部分匹配?
有两个数组,第一个数组要进行搜索,第二个数组要替换文本/值,如果在第一个数组中找到部分或完全匹配项。
目标是以最快的方式搜索数组以进行部分或完全匹配。
有什么建议吗?

我需要索引,以获取第一个数组中的位置,以查找第二个数组中的替换文本。因此,逻辑是在第一个数组中查找部分匹配项,获取位置,使用该位置获取第二个数组中的替换值,然后继续进行替换... 我已经得到了替换部分,只需快速部分数组查找即可。 - crosenblum
有没有其他方法在不循环的情况下对数组中的文本进行部分搜索? - crosenblum
2个回答

11

当然,如果Array.prototype.indexOf()不可用,.inArray()会遍历数组:

代码片段

inArray: function( elem, array ) {
    if ( array.indexOf ) {
        return array.indexOf( elem );
    }

    for ( var i = 0, length = array.length; i < length; i++ ) {
        if ( array[ i ] === elem ) {
            return i;
        }
    }

    return -1;
},

代码片段

如果你只是想知道一个条目是否包含在一个数组中,你可以使用.join()方法并使用String.prototype.indexOf()

当然,这样做不能返回索引。因此,你需要编写自己的逻辑。可以通过修改上面的代码轻松实现。例如:

Array.prototype.ourIndexOf = function(v) {
    for ( var i = 0, length = this.length; i < length; i++ ) {
       if ( typeof this[i] === 'string' && this[i].indexOf(v) > -1 ) {
            return i;
       }
    }
    return -1;
};

['Foobar', 'baseball', 'test123'].ourIndexOf('base') // === 1

@jAndy:仍然可以使用.join()获取索引。如何操作?使用分隔符.join("|"),然后通过要查找的值拆分字符串(您将获得两个字符串:值之前的所有内容和值之后的所有内容)。之后,您只需要计算第一个拆分字符串中分隔符的数量即可。完成。索引已获得。 - Robert Koritnik
这是 jQuery 中的一些 JavaScript 代码吗?我以前见过类似的代码,但从未理解它的来源。 - crosenblum
@Robert:你说得对,但还是有点奇怪。@crosenblum:第一个片段确实来自jQuery源代码。 - jAndy
@jAndy:如果数组很长且包含短字符串,那么这种方法可能是可行的。计算分隔符只需要基本的正则表达式匹配计数即可。在我看来,这并不复杂。 - Robert Koritnik
@Robert:我并没有说复杂,只是有点奇怪。 - jAndy
好的Robert,这有点说得通,但在搜索字符串方面,有没有方法可以获取部分匹配而不是完全匹配?比如,如果您正在搜索字符串"Peaches and pearls are a girls love and joy",并且正在查找单词“pearl”以将其替换为单词“diamond”。我知道.match只能进行精确匹配,但如何进行部分匹配呢? - crosenblum

1

根据您的需求,您可能会发现一些Underscore函数很有用:

  1. detect(返回符合条件的第一个元素)
  2. select(返回所有匹配的元素)
  3. any(如果任何元素匹配,则返回true)
  4. each(迭代元素)
  5. map(将数组转换为新数组)

还有一些其他的函数可能也会对您有用。


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