Значение ключа добавления объекта JavaScript, тот же метод, другой результат

Спасибо, что прочитали меня. Извините за мой английский и мой вопрос может быть глупым. Собираю корзину для интернет-магазина. Я пытаюсь получить данные из продуктов, отображаемых для создания списка заказов. Корзина — это объект с 3 равными методами для добавления количества, имени и цены. Но только одна работа. Два других перезаписывают данные.

Данные, которые я хочу хранить, представляют собой строки.

var Cart = function () {

    this.cartListQte = {}

    this.products_names = {}

    this.products_prices = {}

}

//сорт

Cart.prototype = {

    //properties

    'cartListQte': {},

    'products_names': {},

    'products_prices': {},

    //methods

        //setter getter

    setCartListQte: function (cartListQte) {

        this.cartListQte = cartListQte;

    },

    getCartListQte: function () {

        return this.cartListQte;

    },

    setProducts_names: function (products_names) {

        this.products_names = products_names;

    },

    getProducts_names: function () {

        return this.products_names;

    },

    setProducts_prices: function (products_prices) {

        this.products_prices = products_prices;

    },

    getProducts_prices: function () {

        return this.products_prices;

    },

        //"push" new product

    pushed: function (productId,Qty){

        this.cartListQte[parseInt(productId)]= parseInt(Qty);

    },


    pushName: function (productId,nm){

        this.products_names[parseInt(productId)]= nm;

    },


    pushPrice: function (productId,prx){

        this.products_prices[parseInt(productId)]= parseInt(prx);

    }

}

//жест дю панье

функция addProductToCart (событие) {

//nouveau panier

var cart = new Cart;

    //on récupère le panier déjà enregisté

var curentCart = JSON.parse(localStorage.getItem('panier'));

    //si il existe, on le manipule

if (curentCart != null){

    cart.cartListQte = curentCart.cartListQte;

}

//récupération des nouvelles données à enregistrer

var id = $(this).attr('productid');

var quantity = $("[productIdQte = "+id+"]").val();

console.info(quantity);

var name = String($(".name"+id).text());

console.info(name);

var price = $(".price"+id).text();

console.info(parseInt(price));

    //poussées dans le tableau

if (quantity>0){

    /* exemple who don't work too

    var quantity = "1";

    var name = "a";

    var price = "1" ;

    */
    cart.pushed(id, quantity);

    cart.pushName(id, name);

    cart.pushPrice(id, price);

    //écrasement des données dans le local

    localStorage.setItem('panier', JSON.stringify(cart));

    console.info(cart.cartListQte); 

}

Я ожидаю вывод

cart {

  cartListQte: Object { 5: 4, 6: 3 }

  products_names: Object { 5: "toto", 6: "titi" }

  products_prices: Object { 5: 100, 6: 150 }

}

но фактический результат

cart {

  cartListQte: Object { 5: 4, 6: 3 }

  products_names: Object { 6: "titi" }

  products_prices: Object { 6: 150 }

}

Ваш код правильный, возможно, где-то еще что-то не так. Не могли бы вы добавить фрагмент, где вы создаете корзину объектов и меняете идентификаторы, цены и имена? Кстати, вы должны ожидать product_prices как { 5: null, 6: 150 }, потому что parseInt не может решить «tata» в методе pushPrice.

Federico Galfione 08.04.2019 12:53

Ожидая некоторых обновлений, если вы хотите, чтобы это поведение { 5: "tata", 6: 150 } в свойстве цены вместо этого { 5: null, 6: 150 }, измените "parseInt (prx)" в "parseInt (prx ) ?parseInt(prx): prx";

Federico Galfione 08.04.2019 14:05

Извините, я не видел ваш комментарий :s. Я здесь впервые...

Gauthier 08.04.2019 14:35

может быть, проблема в передаче по ссылке или передаче по значению?

Gauthier 08.04.2019 14:46
Поведение ключевого слова "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
4
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема в том, что вы заменяете контент в объектах.

setProducts_names: function (products_names) {
    this.products_names = products_names;
    // all names are replaced with one actuall setting
},

поэтому код необходимо обновить с помощью оператора с тремя точками, который копирует все атрибуты в ранее сохраненном объекте.

setProducts_names: function (products_names) {
    this.products_names = {...this.products_names,...products_names}; 
    // products_names will be merged
},

Это необходимо добавить к каждому методу set...

На самом деле это не должно работать, потому что методы set в этом конкретном случае никогда не запускаются: @Gauthier с методами push изменяет только один элемент массива, поэтому массив устанавливается только в первый раз, и его экземпляр никогда не изменяется.

Federico Galfione 08.04.2019 13:07

да мне не нужны сеттеры. Волшебная мысль заключается в том, что работает первый метод, а не второй и третий... С тем же значением и тем же синтаксисом это очень странно.

Gauthier 08.04.2019 13:35

@ Готье, как я сказал в комментарии к вашему вопросу, ваш прототип верен (вы можете видеть это из этого стекблиц). Вы должны показать нам, как вы меняете идентификаторы, имена и цены, прежде чем добавлять их в объект корзины.

Federico Galfione 08.04.2019 13:55

Извините, ребята, когда я отвечал на это, была только часть кода :)

Tomáš Kováčik 08.04.2019 15:44
Ответ принят как подходящий

Ну вот, это должно сработать. Вы забыли обновить 2 других массива.

if (curentCart != null){

    cart.cartListQte = curentCart.cartListQte;
    cart.products_names = curentCart.products_names;
    cart.products_prices = curentCart.products_prices;

}

Нет проблем ;). Я думаю, что принято думать, что проблема больше, чем она есть на самом деле. На этом этапе лучше спросить второе мнение :).

Federico Galfione 08.04.2019 15:01

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