Array.push () повторяет одно и то же значение

Это объект, который я пытался создать для управления списком, но где-то что-то не так: всякий раз, когда я использовал list.addItem(); во второй или третий раз, все значения (массив) в list.list; меняются на окончательно добавленное значение (массив).

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.info(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?

Randy Casburn 07.04.2018 07:30

@RandyCasburn Я обновил вопрос о том, как я вызываю функцию.

Giju Gijja 07.04.2018 08:01

Можете ли вы поместить его в jsfiddle и поделиться ссылкой?

Satish Kumar 07.04.2018 08:41

@GijuGijja Если вы не знакомы с jsfiddle, вот пример jsfiddle для кода, который вы вставили до сих пор: jsfiddle.net/7fmcvy5q/11 Я не обнаружил никаких ошибок. : /

sneep 07.04.2018 09:46

спасибо за обновление - вот где ваша проблема! Пожалуйста, посмотрите мой ответ.

Randy Casburn 07.04.2018 16:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
1 662
1

Ответы 1

В обработчике кликов вы присваиваете значение каждого входного элемента переменной item, как если бы item был объектом. К сожалению, вы инициализировали item как массив. Вы должны инициализировать item как объект. Тогда ваш массив list будет содержать list объектов.

Изменять

var item = [];

К

var item = {};

Поскольку вы новичок в программировании, а Javascript необычным образом отличается от этого кода, позвольте мне объяснить, почему не было выдано ошибки, чтобы вы знали об этом.

В JavaScript массивы на самом деле являются объектами. Таким образом, присвоение значения, как у вас (item.blah), фактически помещает это свойство в объект-массив элемента как свойство, но не знает, что ваше намерение состоит в том, чтобы добавить значение в список элементов массива. Javascript выполняет то, что, по его мнению, является вашим намерением.

Другие вопросы по теме