2013-03-08 52 views
0

我正在处理待办事项列表应用程序,用户可以在其中将用户添加到列表项目中以进行列表项目的搜索以及搜索列表项目。下面我正在研究搜索功能。现在发生的事情是,我将一个li项添加到页面上,显示“你找到”+用户搜索的名字+匹配该特定项目的任务。但是,我不知道该怎么做就是匹配使用该名称的每个列表项目。例如,我可以让一个名叫鲍勃的人做三个不同的任务。现在这个搜索将只匹配第一个,但我想匹配所有三个。有什么建议么?匹配每个字符串的使用

function search() { 
    var searchTerm = document.getElementById("search").value; 
    searchTerm = searchTerm.trim(); 

    if(searchTerm == null || searchTerm == "") { 
    alert("Please enter a string to search for"); 
    return; 
    } 
    else { 
    var todoObj = undefined; 
    results = undefined; 
    re = undefined; 

    for(var i = 0; i < todos.length; i++) { 
    todoObj = todos[i]; 
    re = new RegExp(searchTerm, "ig"); 
    resultsOne = todoObj.who.match(re); 
    if(resultsOne) { 
     var ul = document.getElementById("test"); 
     var li = document.createElement(li); 
     li.className = "listItem"; 
     li.innerHTML = "You found " + todoObj.who + " who needs to " + todoObj.task; 
     ul.appendChild(li);  
     } 
     }  
    }  
    } 
+0

在我看来喜欢它应该工作。每个匹配创建一个新的LI并将其附加到UL。你可以创建一个演示它的小提琴吗? – Barmar 2013-03-08 20:23:57

+0

它看起来像是在'for'循环的每次迭代中执行搜索匹配,然后立即显示结果。我可能会建议你保留一个匹配的待办事项列表,然后最后输出结果。 – sweetamylase 2013-03-08 20:24:21

回答

1

保持待办事项的匹配,那么最后的临时列表,到了最后,输出结果:

var matchedTodos = []; // temporary list of matched todos 

for(var i = 0; i < todos.length; i++) { 
    todoObj = todos[i]; 
    re = new RegExp(searchTerm, "ig"); 
    resultsOne = todoObj.who.match(re); 
    if(resultsOne) { 
     // found a match, add it to our temporary list 
     matchedTodos.push(todoObj); 
    } 
} 

// now output the matched todos 

if (matchedTodos.length > 0) { 
    var ul = document.getElementById("test"); 
    var li = document.createElement("li"); 
    li.className = "listItem"; 
    var tasks = ''; 
    var todoObj = null; 
    for(var j = 0; j < matchedTodos.length; j++) { 
     todoObj = matchedTodos[j]; 
     tasks += todoObj.task + ', '; 
    } 
    li.innerHTML = "You found " + todoObj.who + " who needs to " + tasks; 
    ul.appendChild(li); 
} 

你所要的输出是这样"You found Bob who needs to clean his room, take a bath, sleep"。你将不得不增加一些逻辑用于获取的,逗号正确数量的判决是正确的:P

编辑:有他们所有的个人列表项:

var matchedTodos = []; // temporary list of matched todos 

for(var i = 0; i < todos.length; i++) { 
    todoObj = todos[i]; 
    re = new RegExp(searchTerm, "ig"); 
    resultsOne = todoObj.who.match(re); 
    if(resultsOne) { 
     // found a match, add it to our temporary list 
     matchedTodos.push(todoObj); 
    } 
} 

// now output the matched todos 

if (matchedTodos.length > 0) { 
    var ul = document.getElementById("test"); 
    var todoObj = null; 
    for(var j = 0; j < matchedTodos.length; j++) { 
     var li = document.createElement("li"); 
     li.className = "listItem"; 
     todoObj = matchedTodos[j]; 
     li.innerHTML = "You found " + todoObj.who + " who needs to " + todoObj.task; 
     ul.appendChild(li); 
    } 
} 
+0

这是伟大的,但我想我应该添加每个作为一个单独的列表项目 – user2084813 2013-03-08 20:51:18

+0

@ user2084813然后,这更简单!查看编辑。 – sweetamylase 2013-03-08 20:54:21

+0

完美!非常感谢 – user2084813 2013-03-08 20:58:57