【问题标题】:iterate over array in jquery遍历jQuery中的数组
【发布时间】:2013-08-27 19:49:34
【问题描述】:

我正在尝试对从列表中选择项目的用户进行一些验证。我想通过检查 <li> 是否已经在数组中来确保一个项目没有被添加两次。这是我正在尝试的,但它不起作用。

 $(".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);


 });

【问题讨论】:

  • 您也可以只使用常规的 for 循环,这样可能会更快。
  • 我不知道这对您的用例是否重要,但 Array.forEach 在 IE 8 及更低版本中不受支持。 Mozilla Developer link
  • 我读到了。我可能会搬到.each()
  • 即使您的for 正确,您仍然会遇到两个问题,如我的回答中所述。方便的是,您实际上根本就需要循环。

标签: javascript jquery


【解决方案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");
}

【讨论】:

  • 好的。让我解决这个问题。我的第一个警报是这个? alert(itemtoadd + name);//checking 以及错误消息在哪里,else?
  • 另外,用户最多可以添加 4 项,所以我不只是检查一项。每次添加一个项目时,我都需要检查它是否已经在 div 中。
  • 是的,抱歉——我已更新答案以反映添加错误消息。 ......是的 - 我知道这就是你想要做的。我只是说您编写的代码不会那样做。每次添加项目时,您都会创建checkArr新实例
  • 好的。非常感激。感谢您的洞察力
猜你喜欢
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多