简单javascript实现模糊搜索算法与例子

简单的说,编辑距离就是把一个字符串修改变成另一个字符串的修改次数。如果修改的次数越小,我们可以简单的认为这两个字符串之间的关系越紧密。比如 今天是星期几 对于 今天是星期五 和 明天是星期五比较,跟 今天是星期五 更加紧密一些,因为前者的编辑距离是 1,后者的编辑距离是 2。

更详细的百度百科已经说的很清楚了,这里不再赘述,主要给出 JavaScript 的实现方法:

按照自然语言表达的算法,我们先需要根据两个字符串的长度创建一个二维表:

function levenshtein(a, b) {

 var al = a.length + 1;

 var bl = b.length + 1;

 var result = [];

 var temp = 0;

 // 创建一个二维数组

 for (var i = 0; i < al; result[i] = [i++]) {}

 for (var i = 0; i < bl; result[0][i] = i++) {}

}

之后就需要遍历这个二位数组,按照如下的规则取得三个值的最小值:

如果最上方的字符等于最左方的字符,则为左上方的数字。否则为左上方的数字 + 1。
左方数字 + 1
上方数字 + 1
需要判断两个值是否相等来决定左上方数字是否 + 1,所以引入 temp 变量。我们可以写出如下遍历代码:

for (i = 1; i < al; i++) {

 for (var j = 1; j < bl; j++) {

  // 判断最上方和最左方数字是否相等

  temp = a[i - 1] == b[j - 1] ? 0 : 1;

  // result[i - 1][j] + 1 左方数字

  // result[i][j - 1] + 1 上方数字

  // result[i - 1][j - 1] + temp 左上方数字

  result[i][j] = Math.min(result[i - 1][j] + 1, result[i][j - 1] + 1, result[i - 1][j - 1] + temp);

 }

}

最后将二维数组最后一个值返回,该值就是编辑距离:

return result[i-1][j-1];
这个函数就完成了:

function levenshtein(a, b) {

 var al = a.length + 1;

 var bl = b.length + 1;

 var result = [];

 var temp = 0;

 // 创建一个二维数组

 for (var i = 0; i < al; result[i] = [i++]) {}

 for (var i = 0; i < bl; result[0][i] = i++) {}  

 for (i = 1; i < al; i++) {

  for (var j = 1; j < bl; j++) {

   // 判断最上方和最左方数字是否相等

   temp = a[i - 1] == b[j - 1] ? 0 : 1;

   // result[i - 1][j] + 1 左方数字

   // result[i][j - 1] + 1 上方数字

   // result[i - 1][j - 1] + temp 左上方数字

   result[i][j] = Math.min(result[i - 1][j] + 1, result[i][j - 1] + 1, result[i - 1][j - 1] + temp);

  }

 }

 return result[i-1][j-1];

 

}

实际应用

那么我们现在就来实现一个简单的搜索功能。

 

大体思路就是将数据与要搜索的字符串计算编辑距离,然后进行排序,将编辑距离小的放在上面显示。具体 Demo 做在

  

看个小编写的例子

<html>
<head>
<title>Javascript模糊查找</title>
</head>
<body>

<li onload="load('Name')" id="name">Name</li>
<li onload="load('sex')" id="sex">sex</li>
<li onload="load('age')" id="age">age</li>
<li onload="load('job')" id="job">job</li>
<li onload="load('mail')" id="mail">E-mail</li>

<input id="input" type="text" value="" />
<input id="search" type="button" onclick="findEach()" value="Search" />

<script>
var vData= ["name", "sex", "age", "job", "E-mail"];

function load(id)
{
alert(vData[0]);
//vData[vData.length] = document.getElementById(id).innerHTML;
}

function find(sFind, sObj)
{
var nSize = sFind.length;
var nLen = sObj.length;

var sCompare;

if(nSize <= nLen ){
for(var i = 0; i <= nLen - nSize; i++){
sCompare = sObj.substring(i, i + nSize);
if(sCompare == sFind){
return i;
}
}
}

return -1;
}

function findEach()
{
var sFind = document.getElementById("input").value;
if(sFind==""){
alert("Can not be empty");
}

if(sFind!=""){
var nPos;
var vResult = [];
//for(var i = 0; i <= vData.length; i++){
for(var i in vData){
//nPos = find(sFind, vData[i]);
var sTxt=vData[i]||'';
nPos=sTxt.indexOf(sFind);
if(nPos>=0){
vResult[vResult.length] = sTxt;
}
}

alert(vResult);
}
}

</script>
</body>
</html>

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索javascript
, 算法
, 数组
字符串
javascript简单例子、遗传算法简单例子、模糊控制的简单例子、javascript算法、javascript例子,以便于您获取更多的相关知识。

时间: 2024-10-27 23:09:34

简单javascript实现模糊搜索算法与例子的相关文章

javascript中应用 cookie 的 例子

cookie|javascript java中的cookie使用时非常的广泛的,尤其一些 在线 影音 播放的网站, 一般都是用服务器段脚本将 影音文件的名字 放到cookie中,然后在客户段 用 javascript 读取 .这样可以隐蔽 文件的名字,防止下载. 下面就把一个javascript中使用 cookie的例子发出来.大家共同学习.  写 cookie          var expiresTime=new Date();         expiresTime.setTime(ex

Linux下一个简单的多线程互斥锁的例子

本篇文章是对Linux下一个简单的多线程互斥锁的例子进行了分析介绍,需要的朋友可以参考下   复制代码 代码如下: #include <stdio.h> #include <pthread.h> pthread_mutex_t Device_mutex ; int count=0; void thread_func1() {    while(1)    {        pthread_mutex_lock(&Device_mutex);        printf(&q

PHP动态生成javascript文件的2个例子

 这篇文章主要介绍了PHP动态生成javascript文件的2个例子,需要的朋友可以参考下 一.PHP动态生成   第一步:在PHP文件中直接写入JS代码,并在头部声明这是一个JavaScript文件    代码如下:<?php header('Content-Type: application/x-javascript; charset=UTF-8');?> 第二步:用PHP输出转义JavaScript代码  代码如下:function jsformat($str) {     $str =

模糊查询 含通配符-请问谁有stuts2模糊查询的例子啊?要点击获取数据库的,求…

问题描述 请问谁有stuts2模糊查询的例子啊?要点击获取数据库的,求- 如果你有,请发我邮箱,40c币感谢,谢谢!zhangwenh1228@163.com 解决方案 你是要struts2模糊查询相应的action 还是 要到数据库模块查询呢? 如果要到数据库查询 你自己写SQL就可以了 解决方案二: 郁闷,我都悬赏40c也没人给我发呢么-- 解决方案三: stuts2不会直接操作数据库,你要的模糊查询它只能传递下参数给dao层,模糊查询要在dao层的框架写

最简单的基于FFmpeg的AVDevice例子(读取摄像头)【转】

转自:http://blog.csdn.net/leixiaohua1020/article/details/39702113 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] libavdevice使用 注意事项 代码 结果 下载   =====================================================最简单的基于FFmpeg的AVDevice例子文章列表: 最简单的基于FFmpeg的AVDevice例子(读取摄像头) 最简单的基

mysql正则匹配模糊查询的例子

MySQL仅支持多数正则表达式实现的一个很小的子集. ---------------------- 9.2.1  基本字符匹配 REGEXP后所跟的东西作为正则表达式处理.   SELECT prod_name FROM products WHERE prod_name REGEXP '1000' ORDER BY prod_name; ------返回------ +------------------------+ |    prod_name    | +-----------------

javascript数组的深度复制例子

一般情况下,使用 "=" 可以实现赋值.但对于数组.对象.函数等这些引用类型的数据,这个符号就不好使了. 1. 数组的简单复制 1.1 简单遍历 最简单也最基础的方式,自然是循环处理.示例: function array_copy(arr) {     var out = [], i, len;     if (out[i] instanceof Array === false){      return arr;     }     for (i = 0, len = arr.len

Javascript判断终端类型的例子

只要用js获取浏览器的UserAgent判断就可以了 javascript判断浏览器userAgent其实很简单,因为javascript本身就有提供相应的操作,在navigator对象中就有一个userAgent属性,通过userAgent属性我们就可以得到,一串userAgent信息 例如,我们要判断浏览器是不是ipad,那么我们可以这样:  代码如下 复制代码 var isiPad = navigator.userAgent.match(/iPad/i) != null; if(isiPa

Javascript数组去重项的例子

在写Javascript的时候经常遇到数组去重的问题,一直在基于jQuery写代码,在遇到数组需要去重的时候经常使用$.unique方法,由于开发测试环境是chrome浏览器,所以并没有察觉到自己已经错了这么久,直到昨天才发现$.unique在IE中是存在一些问题.   查看了jQuery的API,原来$.unique只处理删除DOM元素数组,而不能处理字符串或者数字数组.看了下jQuery源码,$.unique使用了Sizzle.uniqueSort的方法,好像在chrome/Firefox中