在javascript中,如何在数组中搜索子字符串匹配

时间:2010-12-29 17:05:31

标签: javascript arrays search

我需要在javascript中搜索数组。搜索将仅匹配要匹配的字符串的一部分,因为字符串将分配给它的附加编号。然后我需要使用完整的字符串返回成功匹配的数组元素。

var windowArray = new Array ("item","thing","id-3-text","class");

我需要在其中搜索带有"id-"的数组元素,我还需要拉出元素中的其余文本(即"id-3-text")。

由于

15 个答案:

答案 0 :(得分:34)

如果您能够在项目中使用Underscore.js,那么 _.filter() 数组功能会使这一点变得简单:

// find all strings in array containing 'thi'
var matches = _.filter(
    [ 'item 1', 'thing', 'id-3-text', 'class' ],
    function( s ) { return s.indexOf( 'thi' ) !== -1; }
);

迭代器函数可以执行任何操作,只要它为匹配返回true即可。效果很好。

更新2017-12-03:
现在这是一个非常过时的答案。也许不是大批量中性能最高的选项,但它可以更简洁地编写 lot 并使用本地ES6数组/字符串方法,如.filter().includes():< / p>

// find all strings in array containing 'thi'
const items = ['item 1', 'thing', 'id-3-text', 'class'];
const matches = items.filter(s => s.includes('thi'));

注意: String.prototype.includes()没有&lt; = IE11支持(Edge工作,请注意),但你可以使用polyfill,或者只是回到{{1 }}

答案 1 :(得分:13)

在你的具体情况下,你可以用一个无聊的旧柜台来做到这一点:

var index, value, result;
for (index = 0; index < windowArray.length; ++index) {
    value = windowArray[index];
    if (value.substring(0, 3) === "id-") {
        // You've found it, the full text is in `value`.
        // So you might grab it and break the loop, although
        // really what you do having found it depends on
        // what you need.
        result = value;
        break;
    }
}

// Use `result` here, it will be `undefined` if not found

但如果您的数组是sparse,那么您可以使用设计合理的for..in循环更有效地执行此操作:

var key, value, result;
for (key in windowArray) {
    if (windowArray.hasOwnProperty(key) && !isNaN(parseInt(key, 10))) {
        value = windowArray[key];
        if (value.substring(0, 3) === "id-") {
            // You've found it, the full text is in `value`.
            // So you might grab it and break the loop, although
            // really what you do having found it depends on
            // what you need.
            result = value;
            break;
        }
    }
}

// Use `result` here, it will be `undefined` if not found

注意没有for..inhasOwnProperty检查的天真!isNaN(parseInt(key, 10))循环; here's why


关闭-主题

另一种写作方式

var windowArray = new Array ("item","thing","id-3-text","class");

var windowArray = ["item","thing","id-3-text","class"];

...这对你来说打字较少,也许(这一点是主观的)更容易阅读。这两个语句具有完全相同的结果:包含这些内容的新数组。

答案 2 :(得分:11)

只需搜索普通旧indexOf

中的字符串即可
arr.forEach(function(a){if (typeof(a) == 'string' && a.indexOf('curl')>-1) console.log(a);})

答案 3 :(得分:10)

这里的人们很难做到这一点。只需执行以下操作...

myArray.findIndex(element => element.includes("substring"))

findIndex()是一种ES6高阶方法,它遍历数组的元素并返回与某些条件匹配(作为函数提供)的第一个元素的索引。在这种情况下,我使用ES6语法来声明高阶函数。 element是该函数的参数(可以是任何名称),并且粗箭头声明此后的内容为匿名函数(除非占用多于一行,否则不需要用大括号括起来)。

findIndex()内,我使用了非常简单的includes()方法来检查当前元素是否包含所需的子字符串。

答案 4 :(得分:2)

有关一些替代方案及其效率的精彩研究,请参阅John Resig最近的帖子:

(讨论的问题略有不同,干草堆元素是指针的前缀,而不是相反,但大多数解决方案都很容易适应。)

答案 5 :(得分:2)

实现这一目标的最简单的vanilla javascript代码是

var windowArray = ["item", "thing", "id-3-text", "class", "3-id-text"];
var textToFind = "id-";

//if you only want to match id- as prefix 
var matches = windowArray.filter(function(windowValue){
  if(windowValue) {
      return (windowValue.substring(0, textToFind.length) === textToFind);
  }
}); //["id-3-text"]

//if you want to match id- string exists at any position
var matches = windowArray.filter(function(windowValue){
  if(windowValue) {
      return windowValue.indexOf(textToFind) >= 0;
  }
}); //["id-3-text", "3-id-text"]

答案 6 :(得分:2)

public function store(Request $request){
    $order = new Order();
    $order->user_id = $request->json('user_id');
    $order->item_list = $request->json('item_list');
    $order->leave_note = $request->json('leave_note');
    $order->total = $request->json('total');
    $order->save();

    $response = [
        'status' => 'success',
        'message' => 'order stored',
];

    return response()->json($response);
}

这将返回数组中的实际元素。

myArray.find(element => element.includes("substring"));

这将返回数组中元素的索引。

答案 7 :(得分:1)

REF: In javascript, how do you search an array for a substring match

此处给出的解决方案与solution 4556343#4556343不同,它需要先前的解析来识别与join()一起使用的字符串,该字符串不是任何数组字符串的组成部分。
此外,代码/!id-[^!]*/更准确,/![^!]*id-[^!]*/以适应问题参数:

  1. “搜索数组......”(字符串或数字,而不是函数,数组,对象等)
  2. “仅匹配要匹配的部分字符串”(匹配可以是任何位置)
  3. “返回...匹配...元素”(单数,不是全部,如“... ...元素S”)
  4. “with the full string”(包括引号)
  5. ... NetScape / FireFox解决方案(请参阅下面的JSON解决方案):

    javascript:         /* "one-liner" statement solution */
       alert(
          ["x'!x'\"id-2",'\' "id-1 "',   "item","thing","id-3-text","class" ] .
             toSource() . match( new RegExp( 
                '[^\\\\]("([^"]|\\\\")*' + 'id-' + '([^"]|\\\\")*[^\\\\]")' ) ) [1]
       );
    

    javascript:
       ID = 'id-' ;
       QS = '([^"]|\\\\")*' ;           /* only strings with escaped double quotes */
       RE = '[^\\\\]("' +QS+ ID +QS+ '[^\\\\]")' ;/* escaper of escaper of escaper */
       RE = new RegExp( RE ) ;
       RA = ["x'!x'\"id-2",'\' "id-1 "',   "item","thing","id-3-text","class" ] ;
       alert(RA.toSource().match(RE)[1]) ;
    

    显示"x'!x'\"id-2" 也许突袭阵列找到所有匹配是“更清洁”。

    /* literally (? backslash star escape quotes it!) not true, it has this one v  */
    javascript:                            /* purely functional - it has no ... =! */
       RA = ["x'!x'\"id-2",'\' "id-1 "',   "item","thing","id-3-text","class" ] ;
       function findInRA(ra,id){
          ra.unshift(void 0) ;                                     /* cheat the [" */
          return ra . toSource() . match( new RegExp(
                 '[^\\\\]"' + '([^"]|\\\\")*' + id + '([^"]|\\\\")*' + '[^\\\\]"' ,
                 'g' ) ) ;
       }
       alert( findInRA( RA, 'id-' ) . join('\n\n') ) ;
    

    显示:

         "x'!x'\"id-2"
    
         "' \"id-1 \""
    
         "id-3-text"
    

    使用,JSON.stringify()

    javascript:                             /* needs prefix cleaning */
       RA = ["x'!x'\"id-2",'\' "id-1 "',   "item","thing","id-3-text","class" ] ;
       function findInRA(ra,id){
          return JSON.stringify( ra ) . match( new RegExp(
                 '[^\\\\]"([^"]|\\\\")*' + id + '([^"]|\\\\")*[^\\\\]"' ,
                 'g' ) ) ;
       }
       alert( findInRA( RA, 'id-' ) . join('\n\n') ) ;
    

    显示:

        ["x'!x'\"id-2"
    
        ,"' \"id-1 \""
    
        ,"id-3-text"
    

    皱纹:

    • “未转义”全球RegExp为/[^\]"([^"]|\")*id-([^"]|\")*[^\]"/g\字面意义。为了使([^"]|\")*匹配所有"转义为\"的字符串,\本身必须转义为([^"]|\\")*。如果将此引用为要与id-连接的字符串,则必须再次转义每个\,因此([^"]|\\\\")*
    • 包含ID\*,...的搜索"也必须通过.toSource()或{{1}转义或......。
    • JSON搜索结果应返回null(或'',如EMPTY字符串中包含NO ""!)或"(适用于所有搜索)
    • 如果要将搜索结果合并到程序代码中以进行进一步处理,则需要[],例如eval()

    ----------------------------------------------- ---------------------------------

    题外话:
    袭击和逃跑?这段代码是否有冲突?
    eval('['+findInRA(RA,ID).join(',')+']')的符号学,语法和语义着重阐明了引用文字冲突的逃避。

    “no =”是否意味着:

    • “no'='sign”,如/* it has no ... =! */(不!运行它,看看有!),
    • “没有赋值运算符的javascript语句”,
    • “no equal”,如“在任何其他代码中没有任何相同”(之前的代码解决方案证明有功能等价物),
    • ...

    另一个级别的引用也可以使用下面的立即模式javascript协议URI来完成。 (//注释结束于新行(又名nl,ctrl-J,LineFeed,ASCII十进制10,八进制12,十六进制A),需要引用,因为插入一个nl,通过按Return键调用URI。)

    javascript:alert('\x3D')

    注意:剪切并粘贴任何javascript:/* a comment */ alert('visible') ; javascript:// a comment ; alert( 'not' ) this is all comment %0A; javascript:// a comment %0A alert('visible but %\0A is wrong ') // X %0A javascript:// a comment %0A alert('visible but %'+'0A is a pain to type') ; 行作为立即模式URI(至少在FireFox中至少?),以使用第一个javascript:作为URI方案或协议,其余作为JS标签。

答案 8 :(得分:1)

我创建了一个易于使用的库(ss-search),该库旨在处理对象,但在您的情况下也可以使用:

search(windowArray.map(x => ({ key: x }), ["key"], "SEARCH_TEXT").map(x => x.key)

使用此搜索功能的优势在于,它将在执行搜索之前将文本标准化以返回更准确的结果。

答案 9 :(得分:0)

另一种可能性是

var res = /!id-[^!]*/.exec("!"+windowArray.join("!"));
return res && res[0].substr(1);
如果你有一个特殊的字符分隔符(这里我使用“!”),那么IMO可能有意义,数组是常量或大多数常量(因此连接可以计算一次或很少)并且完整的字符串不是比搜索的前缀长得多。

答案 10 :(得分:0)

  

这是您期望的摘录,其中包含所有匹配值的数组-

var windowArray = new Array ("item","thing","id-3-text","class");

var result = [];
windowArray.forEach(val => {
  if(val && val.includes('id-')) {
    result.push(val);
  }
});

console.log(result);

答案 11 :(得分:0)

let url = item.product_image_urls.filter(arr=>arr.match("homepage")!==null)

具有字符串匹配项的过滤器数组。这很简单,只需一行代码。

答案 12 :(得分:0)

我认为这可能会对您有所帮助。我有一个类似的问题。如果您的数组如下所示:

var array = ["page1","1973","Jimmy"]; 

您可以执行简单的“ for”循环,以在匹配时返回数组中的实例。

var c; 
for (i = 0; i < array.length; i++) {
if (array[i].indexOf("page") > -1){ 
c = i;}
} 

我们创建一个空变量c来存放我们的答案。 然后,我们遍历数组以查找数组对象(例如“ page1”)与我们的indexOf(“ page”)相匹配的位置。在这种情况下,它是0(第一个结果)

如果需要进一步的支持,很乐意扩展。

答案 13 :(得分:0)

这对我有用。

    const filterData = this.state.data2.filter(item=>((item.name.includes(text)) || (item.surname.includes(text)) || (item.email.includes(text)) || (item.userId === Number(text))) ) ;

答案 14 :(得分:0)

使用此功能搜索子字符串项。

function checkItem(arrayItem, searchItem) {
  return arrayItem.findIndex(element => element.includes(searchItem)) >= 0
}

function getItem(arrayItem, getItem) {
  return arrayItem.filter(element => element.includes(getItem))
}

var arrayItem = ["item","thing","id-3-text","class"];


console.log(checkItem(arrayItem, "id-"))
console.log(checkItem(arrayItem, "vivek"))
console.log(getItem(arrayItem, "id-"))