【问题标题】:array.push() repeats same valuearray.push() 重复相同的值
【发布时间】:2018-04-07 05:18:43
【问题描述】:

这是一个我试图创建来管理列表的对象,但是某处出现问题,每当我第二次或第三次使用list.addItem(); 时,list.list; 中的所有值(数组)都会更改为 finally附加值(数组)。

var list = {
  list : [],
  eligible: function(item){
    var status = true;
    var dw = (item.w*item.h*item.l)/169;
    if(dw > item.m){
      status = true;
    }else{
      status = false;
    }
    return status;
  },
  addItem : function(item){
    if(this.eligible(item)){
      this.list.push(item);
      console.log(this.list);
      this.refresh();
      alertify.success('Item Added to List');
    }else{
      alertify.warning('Item not eligible for Freight Calculation');
    }
  },
  removeItem : function(item){
    if(this.inList(item)){
      var itemIndex = this.list.indexOf(item);
      if(itemIndex > -1){
        this.list.splice(itemIndex,1);
        alertify.success('Item Removed from List');
        this.refresh();
      }
    }else{
      alertify.error('Item NOT in List');
    }
  },
  inList: function(item){
    var bool = false;
    if (this.list.filter(function(e) { return e.id === item.id; }).length > 0) {
      bool = true;
    }else{
      bool = false;
    }
    return bool;
  },
  findItem: function (id) {
    for (var i = 0; i < this.list.length; i++) {
      if (this.list[i].id === id) {
        return this.list[i];
      }
    }
  },
  refresh: function(){
    if(this.list.length > 0){
      $('.items .table tbody').empty();
      var itemNo = 0;
      $.each( this.list, function( key, item ) {
        $('.items .table tbody').append('</tr><tr><td>' + ++itemNo + '</td><td>' + item.qty + '</td><td>' + item.m + '</td><td>' + item.h + '</td><td>' + item.w + '</td><td>' + item.l + '</td><td><button data-item=\"' + item.id + '\" class=\"btn btn-remove btn-block\"><i class=\"far fa-minus-square\"></i></button></td><td>Price</td></tr>')
      });
    }else{
      $('.items .table tbody').html('<tr><td colspan=\"8\" style=\"text-align:center;\"> No Items Added.</td></tr>')
    }
  }
};

我找不到问题所在,也许是因为我整天都在尝试这个。顺便说一句,我是编程新手。

更新:这就是我调用 addItem 的方式:

    var id=0; //just for reference     
    $('.btn-add-item').click(function(){
        var item = [];
        item.id = ++id;
        item.qty = parseInt($('input[name=qty]').val());
        item.m = parseFloat($('input[name=weight]').val()).toFixed(3);
        item.w = parseFloat($('input[name=width]').val()).toFixed(2);
        item.h = parseFloat($('input[name=height]').val()).toFixed(2);
        item.l = parseFloat($('input[name=length]').val()).toFixed(2);
        item.country = $('#countrySelect').val();
        list.addItem(item);
    });

【问题讨论】:

  • 怎么叫添加项目?我们能看到 item 对象吗?
  • @RandyCasburn 我更新了我如何调用函数的问题。
  • 你能把它放在jsfiddle中并分享链接吗?
  • @GijuGijja 如果您不熟悉 jsfiddle,这里有一个 jsfiddle 示例,用于您迄今为止粘贴的代码:jsfiddle.net/7fmcvy5q/11 我没有发现任何错误。 ://
  • 感谢您的更新 - 这就是您的问题所在!请看我的回答。

标签: javascript jquery arrays object


【解决方案1】:

在您的点击处理程序中,您将每个输入元素的值分配给变量item,就好像item 是一个对象一样。不幸的是,您已将item 初始化为一个数组。您应该将item 初始化为一个对象。然后,您的 list 数组将包含一个 list 对象。

改变

var item = [];

收件人

var item = {};

由于您是编程新手,而 Javascript 对这段代码有一种奇怪的特殊方式,请让我解释一下为什么没有抛出错误让您知道这一点。

在 JavaScript 中,数组实际上是对象。因此,像您一样分配一个值 (item.blah) 实际上将该属性作为属性放在项 Array Object 上,但不知道您的意图是将值添加到 Array 元素列表中。 Javascript 执行它认为是您的意图的事情。

【讨论】:

    猜你喜欢
    • 2023-01-28
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多