user2084813
user2084813

Reputation: 185

trouble with a search function

function Todo(id, task, who, dueDate) {
    this.id = id;
    this.task = task;
    this.who = who;
    this.dueDate = dueDate;
    this.done = false;
}    

// more code that adds the todo objects to the page and to the array todos

function search() {
    for (var i = 0; i < todos.length; i++) {
        var todoObj = todos[i];
        console.log(todoObj.who); //shows both jane and scott
        console.log(todoObj.task); // shows both do something and get milk
    }
    var searchTerm = document.getElementById("search").value;
    searchTerm = searchTerm.trim();
    var re = new RegExp(searchTerm, "ig");
    var results = todoObj.who.match(re);
    if (searchTerm == null || searchTerm == "") {
        alert("Please enter a string to search for");
        return;
    } else {
        alert(results);
    }
} 

This is a search function where I am trying to match what the user types into the search bar with objects that I have created earlier in the code. They must match the "who" and "task" parameters that I have given to the objects. So one object is who: jane task: do something and the other is who: scott task: get milk. The problem is, in my last alert I can only match scott and not jane. Scott is the last one I added. Is there some way I need to modify my loop or change my search criteria?

Upvotes: 0

Views: 65

Answers (1)

Ian
Ian

Reputation: 50923

Your problem is that you are looping through the items, but then using todoObj after that loop. So todoObj will just hold the last item in the array. You need to reorganize a little...try something like this:

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 = new RegExp(searchTerm, "ig");

        for (var i = 0; i < todos.length; i++) {
            todoObj = todos[i];
            results = todoObj.who.match(re);
            if (results) {
                alert("You found " + todoObj.who + ", who needs to " + todoObj.task + " by " + todoObj.dueDate);
                return;
            }
            console.log(re.lastIndex);
        }

        alert("You didn't match anyone");
    }
}

Here's an example of it working as I think you want it to: http://jsfiddle.net/sHSdK/2/

Upvotes: 1

Related Questions