2013-04-02 2 views
1

Скрипт работает, прося пользователя добавить или удалить элемент в массиве. Затем попросит продолжить этот цикл. Проблема здесь в том, что мой скрипт не соответствует моему вводу пользователя (removeItem) для элемента в списке (myList [i]). Я нахожусь в недоумении, почему это не соответствует.Попытка добавления и удаления элементов из массива

// new method for removing specific items from a list 
Array.prototype.remove = function(from,to) { 
    var rest = this.slice((to || from) + 1 || this.length); 
    this.length = from < 0 ? this.length + from : from; 
    return this.push.apply(this, rest); 
}; 

printList = function() { 
    var listLength = myList.length; 
    for (i = 0; i < listLength; i++) { 
     document.write(i + ":"); 
     document.write(myList[i] + "<br/>"); 
    }; 
    document.write("<br/><br/>"); 
}; 

// initial list 
var myList = new Array(); 
if (myList.length === 0) { 
    document.write("I have " + myList.length + " item in my list. It is: <br/>"); 
} 
else { 
    document.write("I have " + myList.length + " items in my list. They are: <br/>"); 
} 
printList(); 

var continueAdding = "yes"; 
var askToContinue = ""; 

while (continueAdding === "yes") { 
    // loop 
    var askUser = prompt("What do you want to [A]dd or [R]emove an item to your inventory?").toUpperCase(); 
    switch (askUser) { 
     case "A": { // add an user specified item to the list 
      var addItem = prompt("Add something to the list"); 
      myList.push(addItem); 
      printList(); 
      break; 
     } 
     case "R": { // remove an user specified item from the list 
      var removeItem = prompt("what do you want to remove?"); 
      var listLength = myList.length; 
      for (i = 0; i < listLength; i++) { 
       if (removeItem === myList[i]) { 
        document.write("I found your " + removeItem + " and removed it.<br/>"); 
        myList.remove(i); 
       } 
       else { 
        document.write(removeItem + " does not exist in this list.<br/>"); 
        break; 
       } 
       if (myList.length === 0) { 
        myList[0] = "Nada"; 
       } 
      }; 
      printList(); 
      break; 
     } 
     default: { 
      document.write("That is not a proper choice."); 
     } 
    }; 

    askToContinue = prompt("Do you wish to continue? [Y]es or [N]o?").toUpperCase(); // ask to continue 
    if (askToContinue === "Y") { 
     continueAdding = "yes"; 
    } 
    else { 
     continueAdding = "no"; 
    } 
} 

ответ

1

Ваша петля никогда не позволяет ей проходить через все элементы, потому что она разбивается на первую итерацию, если элемент не соответствует.

break заявление должно быть в if блоке, а не в else блоке - используйте вместо этого:

for (i = 0; i < listLength; i++) { 
    if (removeItem === myList[i]) { 
     document.write("I found your " + removeItem + " and removed it.<br/>"); 
     myList.remove(i); 
     break; 
    } 
    else { 
     document.write(removeItem + " does not exist in this list.<br/>"); 
    } 
}; 

if (myList.length === 0) { 
    myList[0] = "Nada"; 
} 

Кроме того, обратите внимание, что он ищет точного матча, чувствительны к регистру, так же знаки препинания, и все. Если вы хотите, чтобы это было немного более мягким, вам нужно будет изменить сценарий, чтобы преобразовать обе строки в нижний регистр и начертить пунктуацию перед их сопоставлением.

Редактировать: Просто заметили что-то еще - тестирование для пустого списка должно выполняться вне цикла. Я обновил приведенный выше код, чтобы отразить это.

Смежные вопросы