Как создать функцию для добавления нового объекта в массив

184
02 января 2022, 12:00

Создать массив «Список покупок». Каждый элемент массива является объектом, который содержит название продукта, необходимое количество и куплен или нет. Написать несколько функций для работы с таким массивом.

  1. Вывод всего списка на экран таким образом, чтобы сначала шли некупленные продукты, а потом – купленные.

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

В коде я сделал что бы массив сортировался по статусу( куплена вещь или нет). Далее я в ручную создал новый обьект и добавил его с помощью метода push в массив. Не понимаю, как можно создать функцию которая будет создавать новый обьект этого класса и добавлять его в массив

class Product { 
  constructor(nameOfProduct, amount, status) { 
    this.nameOfProduct = nameOfProduct; 
    this.amount = amount; 
    this.status = status; 
  } 
 
  static sortProduct(a) { 
    if (a.status == 'Не куплен') return -1;  
    if (a.status == 'Куплен') return 1;  
  } 
 
  static showProduct(a) { 
    return a.nameOfProduct; 
  } 
} 
  
let shopList = [ 
  new Product('Банан', 2, 'Не куплен'), 
  new Product('Апельсин', 5,'Куплен'), 
  new Product('Молоко', 1, 'Куплен'), 
  new Product('Груша', 10, 'Не куплен'), 
]; 
 
shopList.sort(Product.sortProduct); 
console.log(shopList.map(Product.showProduct)); 
let newProduct = new Product('Шоколад', 2, 'Не куплен'); 
 
shopList.push(newProduct); 
shopList.sort(Product.sortProduct); 
console.log(shopList.map(Product.showProduct));

Answer 1

class Product { 
  constructor(params = {}) { 
    Object.assign(this, { 
      pName: null,  
      amount: 1,  
      bought: false 
    }, { ...params });  
  } 
 
  static sortDefault(a, b) {  // чтобы сначала шли некупленные продукты, а потом – купленные 
    return (a.bought - b.bought) * 10 + a.pName.localeCompare(b.pName);  
  };  
} 
Product.prototype.toString = function () { 
  return `${this.pName} (x${this.amount}), ${this.bought ? 'куплено' : 'не куплено'}`; 
};  
 
 
const shopList = [ 
  { pName: 'Банан', amount: 2 }, 
  { pName: 'Апельсин', amount: 5, bought: true }, 
  { pName: 'Молоко', bought: true }, 
  { pName: 'Груша', amount: 10 } 
].map(prodDef => new Product(prodDef)); 
 
const addToShopList = prodDef => {  // при добавлении покупки с уже существующим в списке продуктом, необходимо увеличивать количество в существующей покупке, а не добавлять новую 
  const prod = shopList.find(prod => prod.pName === prodDef.pName);  
  if (!prod) return shopList.push(new Product(prodDef));  
  prod.amount += prodDef.amount;  
};  
const printShopList = () => shopList.forEach( 
  (prod, i) => console.log(`${i + 1}. ${prod}`) 
);  
 
shopList.sort(Product.sortDefault); 
printShopList(); 
console.log('---');  
 
addToShopList({ pName: 'Банан', amount: 3 }); 
addToShopList({ pName: 'Шоколад', amount: 2 }); 
shopList.sort(Product.sortDefault); 
printShopList();

Answer 2
class Product {
  ...
  static addProduct(products, nameOfProduct, amount, status) {
    products.push(new Product(nameOfProduct, amount, status));
  } 
}
...
Product.addProduct(shopList, 'Шоколад', 2, 'Не куплен');

Посмотрите, как должна выглядеть функция сравнения для Array.sort:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

READ ALSO
Использование компонентов Vue

Использование компонентов Vue

У меня есть компонент(в этом случае не важно какой, важна суть), в котором что-то записано в template, все по дефолту

179
несколько вариантов в indexOf

несколько вариантов в indexOf

Я не силен в js и только начинаю разбираться с нимСмог смастерить вот такой код, его задача:

186
SyntaxError vue js [закрыт]

SyntaxError vue js [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

177
Помогите правильно разместить блок

Помогите правильно разместить блок

Помогите разместить блок(content) под меню, а то я голову уже сломалИ все ни как не получается

93