【问题标题】:Jquery - Only add item in array if its not present and update its quantity if its in arrayJquery - 如果它不存在,则仅在数组中添加项目,如果它在数组中则更新其数量
【发布时间】:2016-12-27 11:12:44
【问题描述】:

我有一个表单,用户可以在其中输入详细信息并通过选中复选框来选择一个项目。

单击添加按钮时,检查项目值和存储在数组中的用户输入值,我在 url 中传递这些值。

用户可以添加多个具有不同名称和电子邮件的项目。假设我有三个项目,所以用户可以选择 item1 并填写 name1 和 email1 并单击添加按钮,类似地,如果他选择 item1 和 item2 并添加 name2 和 email2,他可以添加这些值。

每次点击时我都想检查项目 id 是否已经存在于数组中我不想添加它,只需增加数组中已经存在的该项目的数量并使用新数量更新数组

var allVals = []; //array where i am storing selected checkbox value
jQuery("#btnadd").click(function(event) { //on click of this button i am getting all values to construct url and pass this value to multi div from where i will validate my url 
    var qty;
    jQuery(".selectitem:checked").each(function() {
            qty = jQuery(this).next().find('input[name="quantity"]').val()); //getting quantity of selected checkbox its a input field
        if (jQuery.inArray(jQuery(this).val(), allVals) == -1) {
            allVals.push(jQuery(this).val() + ',' + qty); //item id not present in array so adding item id,qty in array
        } else {
            qty = qty + 1;
            //here i would like to increase quantity of those items only which already present in array something like this.qty and update my allVal array with this new quantity
        }
    });
var rslt = allVals.join(';'); jQuery('#multi').val(rslt); //updating multi div value with allVals from here i will make redirect. Just want to pass correct values in that field
});

【问题讨论】:

  • 你的 HTML 好吗?
  • 所以问题在于更新数量对吗?此外,您将数据添加到数组中的方式效率不高。就像这种方法一样,您不知道哪个项目有什么数量
  • 是的...只有数量更新...我的代码在不同的字符串中添加项目 id...如果我选择两次 item1 它在数组中添加 item1,1;item1,1 像这样但我想显示它 item1,2;以这种方式
  • 你是不是只有数组?我可以建议一个更好的方法,我觉得会更容易处理
  • 是的,一切都会好的

标签: jquery


【解决方案1】:

问题:现在您将项目名称和数量都插入到像[item1,1,item2,1,...] 这样的数组中,所以从技术上讲,您无法控制item1 与什么值相关联。即使您编写一个逻辑来获取项目名称的下一个索引,它也没有效率。

解决方案:我建议你使用 Object 而不是数组。因为使用对象,您可以使用property Name 访问并为其分配值。它的耦合性更强。请看下面的例子

var allVals = {}; // make it a object.

使用此结构,您可以用此代码替换整个 if else 块。

var key = jQuery(this).val();
allVals[key] =  (allVals[key] || 0 ) + parseInt(qty,10);

解释上述语法。

  • allVals[key] - 在这里您正在添加新属性/按名称访问现有属性 item1item2 等...

  • (allVals[key] || 0 ) - 如果属性已存在,则使用其值。否则使用 0,因为它将是 undefined

  • parseInt(qty,10); - 由于您正在进行数学运算,因此始终建议您将数据转换为数字类型,然后执行数学运算。这里如果你不使用parseint你的qty将会是字符串,你会得到无效的结果。

使用上面的语法,你的最终语法应该像..

var allVals = {}; 
jQuery("#btnadd").click(function(event) { 
    var qty;
    jQuery(".selectitem:checked").each(function() {
            qty = jQuery(this).next().find('input[name="quantity"]').val(); 
            var key = jQuery(this).val();
            allVals[key] =  (allVals[key] || 0 ) + parseInt(qty,10);
    });
//var rslt = allVals.join(';'); jQuery('#multi').val(rslt); 
// since your data structure has changed I am not sure if you need this.
});

allVals的最终数据会像..

{
 item1 : 2,
 item2 : 3,
 item3 : 1,
 item4 : 1 
}

【讨论】:

  • 感谢您的回复....如何将此值传递给#multi div....使用您评论的同一行?
  • @Uidev123 你想在 div 中显示它吗?或者它是一个文本框?这些数据的最终目标是什么?你要把它传回你的服务器吗?
  • 它的隐藏输入框,我必须在其中传递数据并基于此需要创建一个 url
  • @Uidev123 将数据传递给服务器.. 现有的allVals 是正确的格式.. 我不确定创建 URL 的部分.. 但无论如何你都可以循环对象并以您需要的方式格式化数据..您期望的最终格式是什么以及它的原因是什么?
  • allVals.push(jQuery(this).val()+','+qty+','+'custcol_name_of_attendees|'+nameatt);这是我需要的格式,其中 nameatt 是用户名。像这样的东西我需要传递给#multi
【解决方案2】:

在数组中循环查找键并将数量更新为值。

    var qty;
     jQuery(".selectitem:checked")
       .each(function() {
           qty = jQuery(this)
             .next()
             .find('input[name="quantity"]')
             .val()); //getting quantity of selected checkbox its a input field
         if (jQuery.inArray(jQuery(this)
             .val(), allVals) == -1) {
           allVals.push(jQuery(this)
             .val() + ',' + qty); //item id not present in array so adding item id,qty in array
         } else {
           qty = qty + 1;

           for (var i = 0; i < allVals.length; i++) {
             if (allVals[i].Key == jQuery(this)
               .val()) {
               allVals[i].Value = qty;
             }
           }
         });

【讨论】:

  • 感谢您的回复...我已经尝试过您的解决方案,但它不起作用
猜你喜欢
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 2021-02-10
  • 2012-03-25
  • 1970-01-01
  • 2017-04-11
相关资源
最近更新 更多