博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS高效关键字搜索---转
阅读量:6440 次
发布时间:2019-06-23

本文共 2091 字,大约阅读时间需要 6 分钟。

原文地址:

 

重点关注评论中的代码..

 

var
treeSearch = {
    
makeTree:
function
(strKeys) {
        
"use strict"
;
        
var
tblCur = {},
            
tblRoot,
            
key,
            
str_key,
            
Length,
            
j,
            
i
            
;
        
tblRoot = tblCur;
        
for
( j = strKeys.length - 1; j >= 0; j -= 1) {
            
str_key = strKeys[j];
            
Length = str_key.length;
            
for
( i = 0; i < Length; i += 1) {
                
key = str_key.charAt(i);
                
if
(tblCur.hasOwnProperty(key)) {
//生成子节点 
                    
tblCur = tblCur[key];
                
}
else
{
                    
tblCur = tblCur[key] = {};
                
}
            
}
            
tblCur.end =
true
;
//最后一个关键字没有分割符
            
tblCur = tblRoot;
        
}
        
return
tblRoot;
    
},
    
search:
function
(content, tblRoot) {
        
"use strict"
;
        
var
tblCur,
            
p_star = 0,
            
n = content.length,
            
p_end,
            
match, 
//是否找到匹配
            
match_key,
            
match_str,
            
arrMatch = [], 
//存储结果
            
arrLength = 0  
//arrMatch的长度索引
            
;
  
        
while
(p_star < n) {
            
tblCur = tblRoot;
//回溯至根部
            
p_end = p_star;
            
match_str =
""
;
            
match =
false
;
            
do
{
                
match_key = content.charAt(p_end);
                
if
(!(tblCur = tblCur[match_key])) {
//本次匹配结束
                    
p_star += 1;
                    
break
;
                
}
else
{
                    
match_str += match_key;
                
}
                
p_end += 1;
                
if
(tblCur.end ===
true
)
//是否匹配到尾部  //找到匹配关键字
                
{
                    
match =
true
;
                
}
            
}
while
(
true
);
  
            
if
(match ===
true
) {
//最大匹配
                
arrMatch[arrLength] = {
//增强可读性
                    
key: match_str,
                    
begin: p_star - 1,
                    
end: p_end
                
};
                
arrLength += 1;
                
p_star = p_end;
            
}
        
}
        
return
arrMatch;
    
}
};

使用实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function
test(strContent, strKeys) {
    
var
arrMatch,
        
tblRoot = treeSearch.makeTree(strKeys),
        
t =
new
Date();
  
  
    
arrMatch = treeSearch.search(strContent, tblRoot);
  
    
console.log(
"time is: "
+ (
new
Date() - t) +
"mm"
);
  
    
console.log(arrMatch);
}
var
s = (
function
() {
    
var
Things = [
' '
,
'\n'
,
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'F'
,
'G'
,
'H'
,
'I'
,
'J'
,
'K'
,
'L'
,
'M'
,
'N'
,
'O'
,
'Q'
,
'R'
,
'S'
,
'T'
,
'U'
,
'V'
,
'W'
,
'X'
,
'Y'
,
'Z'
,
'a'
,
'b'
,
'c'
,
'd'
,
'e'
,
'f'
,
'g'
,
'h'
,
'i'
,
'j'
,
'k'
,
'l'
,
'm'
,
'n'
,
'o'
,
'q'
,
'r'
,
's'
,
't'
,
'u'
,
'v'
,
'w'
,
'x'
,
'y'
,
'z'
];
    
var
s =
""
;
    
for
(
var
i = 1000000; i >= 0; i--) {
        
s += Things[parseInt(Math.random() * Things.length) % Things.length]
    
};
    
return
s;
})()
test(s, [
"abc"
,
"efge"
,
"fun"
,
"tree"
]);

转载于:https://www.cnblogs.com/ry123/archive/2013/04/24/3039720.html

你可能感兴趣的文章
笔记 百度搜索
查看>>
控制台 - 网络管理之华为交换机 S系列端口限速
查看>>
我的友情链接
查看>>
linux为启动菜单加密码
查看>>
MySQL5.5编译方式安装实战
查看>>
细谈Ehcache页面缓存的使用
查看>>
GridView如何设置View的初始样式
查看>>
Placeholder in IE8 and older
查看>>
SQL语句字符串处理大全
查看>>
环境变量的作用,为什么要设置环境变量?
查看>>
从尾到头打印单链表
查看>>
getopt
查看>>
我的第一个IT产品:PublicLecture@HK【My First IT Product】
查看>>
优秀员工与普通员工
查看>>
CCNP学习笔记15-RSTP
查看>>
DELL服务器iDRAC相关设置
查看>>
JVM学习笔记(一)------基本结构
查看>>
$@等特定shell变量的含义
查看>>
我的友情链接
查看>>
(超详细版)Linux下Hadoop2.7.1集群环境的搭建(3台为例)
查看>>