如何在 Jquery 中搜索数组,如 SQL LIKE %value% 语句

Posted

技术标签:

【中文标题】如何在 Jquery 中搜索数组,如 SQL LIKE %value% 语句【英文标题】:How to search an array in Jquery like SQL LIKE %value% statement 【发布时间】:2011-07-16 12:54:38 【问题描述】:

我有一个包含一些值的数组。如何使用 jquery 在该数组中搜索匹配或接近的值?

var a = ["foo","fool","cool","god"];

如果我想搜索oo,那么它应该返回foofoolcool,因为这些字符串包含oo

【问题讨论】:

也许是api.jquery.com/contains-selector @3nigma 用于 DOM 元素的内容。这只是一个简单的数据结构。 【参考方案1】:

原版JS

要使用 Vanilla JS 在数组中搜索,我会使用在数组原型中实现的 filter() 方法。

注意:对于 非常 大的数组,您可能需要考虑将它们重构为 async/await 函数,否则可能会降低用户界面的速度.

1。使用正则表达式(较慢)

这是最灵活的方法,因为您可以搜索不同的模式。您应该知道这里的搜索词不是纯文本,因此您必须根据语法转义大多数非字母数字字符。您不应将未处理的用户输入直接传递给函数,因为它不会按预期工作。

let a = ["foo","fool","cool","god"];
var term = 'oo'; // search term (regex pattern)
var search = new RegExp(term , 'i'); // prepare a regex object
let b = a.filter(item => search.test(item));
console.log(b); // ["foo","fool","cool"]

2。使用indexOf(更快)

在这种特殊情况下,我宁愿使用indexOf(),它基本上相当于LIKE %term%,但在处理大型数组时比使用正则表达式快得多。

进行不区分大小写的搜索是一种常见的情况,因此请确保对搜索词和数组项都使用toLowerCase()。否则将其从示例中的所有位置删除。

let a = ["foo","fool","cool","god"];
let term = 'oo';
let b = a.filter(item => item.toLowerCase().indexOf(term) > -1);
console.log(b); // ["foo","fool","cool"]

ES6 风格(ES2015)

const fruits = ['apple', 'banana', 'grapes', 'mango', 'orange'];

const filterItems = (needle, heystack) => 
  let query = needle.toLowerCase();
  return heystack.filter(item => item.toLowerCase().indexOf(query) >= 0);


console.log(filterItems('ap', fruits)); // ['apple', 'grapes']
console.log(filterItems('ang', fruits)); // ['mango', 'orange']

ES5 风格

var fruits = ['apple', 'banana', 'grapes', 'mango', 'orange'];

function filterItems(needle, heystack) 
  var query = needle.toLowerCase();
  return heystack.filter(function(item) 
      return item.toLowerCase().indexOf(query) >= 0;
  )


console.log(filterItems('ap', fruits)); // ['apple', 'grapes']
console.log(filterItems('ang', fruits)); // ['mango', 'orange']

这是过时的答案

要使用 jQuery 在数组中搜索,您可以使用 jQuery.grep()jQuery.map()。两者都使用过滤后的元素返回新数组 回调函数。

最快的实现(不区分大小写)是使用indexOf 和 回调中的toUpperCase

var search_term = 'oo'; // your search term as string
var search = search_term.toUpperCase();
var array = jQuery.grep(a, function(value) 
    return value.toUpperCase().indexOf(search) >= 0;
);

如果您不需要不区分大小写的搜索,您可以同时删除 .toUpperCase() 以进一步加快搜索速度。

更灵活但慢得多(对于小型阵列来说足够好)是使用 正则表达式:

var search_term = "oo"; // search term
var search = new RegExp(search_term , "i");
var arr = jQuery.grep(a, function (value) 
    return search.test(value);
);

var search_term = "oo"; // search term
var search = new RegExp(search_term , "i");
var arr = jQuery.map(a, function (value) 
    return value.match(search) ? value : null;
);

正则表达式允许您进行比%value% 复杂得多的搜索。但是,如果您不需要它,请不要使用它,因为它是 慢很多倍。

你应该得到一个包含匹配元素的数组arr

【讨论】:

如何在搜索时传递变量而不是“oo” = /oo/gi;是不是像 search = /my_var/gi; ? 应该使用search = new RegExp(my_var, "gi"); /oo/gi 是new RegExp("oo","gi"); 的快捷方式,但要注意$.grep$.map 不能有额外的参数,所以你的my_var 必须定义在全局范围,这不是一个好习惯,但没有看到其他简单的方法 感谢您的评论 :) 我已经找到了这个解决方案 dreamincode.net/forums/topic/… 顺便说一句,再次感谢您并将您评为伟大的评论 感谢帮助。保留它。 亲爱的上帝,永远不要在正则表达式中使用“gi”。 ***.com/questions/1520800/…【参考方案2】:
function find(arr) 
    var result = [];

    for (var i in arr) 
        if (arr[i].match(/oo/)) 
            result.push(arr[i]);
        
    

    return result;


window.onload = function() 
    console.log(find(['foo', 'fool', 'cool', 'god']));
;

它打印["foo", "fool", "cool"]

【讨论】:

【参考方案3】:

试试下面的js代码

function likeMatch(q)

    my_arr = ["foo","fool","cool","god"];
    var rArr=[];

    for(var t in my_arr)
    
      if(my_arr[t].indexOf(q)>0)   
      rArr.push(my_arr[t]);
    
  return(rArr);

【讨论】:

【参考方案4】:

试试这个:

var infoData = ["foo","fool","cool","god"], 
search   = 'oo';

//this makes the magic
infoData = $$(infoData).filter(function()
        return (this.search(search) >= 0)
    )  

var n = infoData.length;
    console.log("size result: "+ n );

for(var item = 0; item < n ;item++)
    console.log("item: "+item+" data : "+infoData[item]);       

结果:

size result: 3

item: 0 data : foo
item: 1 data : fool
item: 2 data : cool 

【讨论】:

【参考方案5】:

试试$.inArrayhttp://api.jquery.com/jQuery.inArray/。我不确定它是否允许您使用正则表达式,但值得一试

【讨论】:

【参考方案6】:

您可以使用Alasql javascript SQL 库来实现。 它支持 LIKE 运算符,就像在 SQL 中一样

var a = ["foo","fool","cool","god"];
var searchString = "%oo%";

var res = alasql('SELECT COLUMN * FROM [?] WHERE [0] LIKE ?',[a, searchString]);

在 jfFiddle 尝试this example。

【讨论】:

示例中的 jsFiddle 使用了一个过时的库。拜托,这个更新了:jsfiddle.net/0xs2nxxp/41【参考方案7】:

如果您在包含哈希对象的数组中搜索,请使用以下函数

 function searchInArrayofHashes(array,key,keyword) 
  responsearr = []
  for(i=0;i<array.length;i++) 
      if(array[i][key].indexOf(keyword) > -1 ) 
        responsearr.push(array[i])
    
  
  return responsearr

【讨论】:

【参考方案8】:

如果你想匹配任何正则表达式,你可以在数组上使用 find 方法:

Array.find(x => /^left:/.test(x)

【讨论】:

以上是关于如何在 Jquery 中搜索数组,如 SQL LIKE %value% 语句的主要内容,如果未能解决你的问题,请参考以下文章

如何用jquery获得每个ul下最后一个li

jquery如何获取ul中第一个li和最后一个li

如何用jquery获得每个ul下最后一个li

jquery如何获取div中li元素

jquery 字符串变成数组

如何使用 jquery 获取选中复选框数组的长度?