2013-08-27 101 views
0

我想對用戶從列表中選擇項目做一些驗證。我想通過檢查<li>是否已經在陣列中來確保沒有兩次添加項目。這是我正在嘗試,而不是工作。遍歷jquery中的數組

$(".List").on("click", "li", function() { 
var i = 0; 
var checkArr = []; 

var div = $("#AddedItems"); 
var parent = $(this).closest("ul"); 
var itemtoadd = parent.find("[data-id]").attr("data-id"); 
var name = parent.find("[data-name]").attr("data-name"); 

alert(itemtoadd + name);//checking 

var itemtoadd = ("<li id = " + itemtoadd + " class = \"itemAdd\">" + name + "</li>"); 

checkArr.push(itemtoadd); //put one in to check against? 
checkArr.forEach(item) 
{ 
    if (item == itemtoadd) 
     alert("this item has already been added"); 
    else { 
     checkArr.push(itemtoadd); 
     alert(itemtoadd); 
     $(itemtoadd).appendTo(div); 
    } 
} 
// div.html(itemtoadd); 


}); 
+0

你也可以使用常規for循環,這可能會更快。 – Jeffpowrs

+0

我不知道這是否對您的用例很重要,但是IE 8和以下版本不支持Array.forEach。 [Mozilla開發者鏈接](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FArray%2FforEach) – hradac

+0

我讀過。我可能會移動到'.each()' – rogerthat

回答

1

你在這裏至少有三個問題:

  1. 你沒有正確使用Array.forEach - 它需要一個函數,它的項目。
  2. 在你做檢查之前,你正在添加你正在尋找的物品。你總是會遇到alert的情況。
  3. 您正在使用checkArr作爲局部變量 - 每次輸入函數時都會得到一個空數組。

大家都說,你可以完成你的目標,而不需要保持一個數組。我相信你可以用你的第一個警報取代所有的東西:

if ($('#' + itemtoadd, div).length == 0) { 
    itemtoadd = ("<li id = " + itemtoadd + " class = \"itemAdd\">" + name + "</li>"); 
    div.append(itemtoadd); 
} 
else { 
    alert("this item has already been added"); 
} 
+0

好的。讓我解決這個問題。我的第一個警告是這個? 'alert(itemtoadd + name); //檢查錯誤消息在'else'中的位置? – rogerthat

+0

此外,用戶最多可以添加4個項目,因此我不只是檢查一個項目。每次添加項目時,我都需要檢查它是否已經在div中。 – rogerthat

+0

是的,對不起 - 我已更新答案以反映添加錯誤消息。 ...是的 - 我明白這就是你想要做的。我只是說你寫的代碼不會那樣做。每次添加項目時,您都會創建'checkArr'的*新實例*。 – pkh