2013-08-27 102 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