Как выбрать несколько продуктов, чтобы в абзац писалась их общая стоимость

Необходимо создать div с ценами на продукты и их названиями, чтобы при нажатии на определенный div его цена отражалась в абзаце, а при выборе нескольких div в абзац писалась итоговая сумма

Моего ума хватило пока только на это:

  
  let p = document.querySelector("p");
  let arr = [];
  let divs = document.querySelectorAll("div");
  for (const div of divs) {
    div.addEventListener("click", function () {
      if (div.click) arr.push(div.textContent);
      p.innerHTML = "Итого:" + arr ;
    });
  }
 
  <div>Яблоки: 200</div>
<div>Вишни: 300</div>
<div>Груши: 250</div>
<p></p>

Сразу укажу, что в тексте задания не пояснено в каком формате создавать и компоновать divы в html т.е можно как удобно и логично для Вас. Я сейчас пробую варианты с созданием объектов из div и получением из них цены. Есть еще несколько идей, но они ообще на стадии размышлений.


Ответы (2 шт):

Автор решения: Dev18

добавлю data-price, в html можно добавлять аттрибуты, так удобней будет брать цену через getAttribute

<div class="product" data-price="200">Яблоки: 200</div>

для общей суммы я могу использовать множество, оно не допускает повторяющихся элементов, что я проверяю при клике, выбран или нет элемент, дополнительно подстветив его цветом, но я оставлю эту часть закомментированной, чтобы было максимально просто

//todo если "вернул/передумал", предусмотреть, если ввел 0 к примеру, чтоб отнимать из итого(?)
//todo если захотел купить 100гр, добавить аттрибут data-unit="кг"...

let p = document.querySelector("p");
let total = 0; //итоговая сумма
let selectedDivs = new Set(); //множество, чтоб наши дивы хранить  

let divs = document.querySelectorAll(".product");
for (const div of divs) {
  div.addEventListener("click", function() {
    let price = parseInt(div.getAttribute('data-price')); //берем цену
    if (isNaN(price)) return; //если вдруг аттрибут пуст 

    //предусмотрим случай больше кг
    let quantity = parseInt(prompt("Введите количество:", 1)); //по умолчанию 1 поставлю
    if (isNaN(quantity) || quantity <= 0) return; //проверка
    let totalForProduct = price * quantity; //стоимость продукта за выбранное количество
    total += totalForProduct; //добавляем стоимость выбранного количества к итоговой сумме
    /* раскоментировать, чтоб использовать "массив/коллекцию Set"
    if (!selectedDivs.has(div)) {
      selectedDivs.add(div); //если продукт еще не был выбран, добавляем его в Set
      div.style.backgroundColor = "#d3f8d3"; //можно выделить цветом
    }
    */
    p.innerHTML = "Итого: " + total; //итого
  });
}
<div class="product" data-price="200">Яблоки: 200</div>
<div class="product" data-price="300">Вишни: 300</div>
<div class="product" data-price="250">Груши: 250</div>
<p>Итого: 0</p>

→ Ссылка
Автор решения: alexWithoutBeard

Я доделал свой вариант и получилось следующее:

   let p = document.querySelector("p");
  let arr = [];
  let arr2 = [];
  let divs = document.querySelectorAll("div");
  for (const div of divs) {
    div.addEventListener("click", function () {
      arr.push(Number(div.textContent.split(" ").slice(-1)));
      arr2.push(div.textContent.split(","));
      p.innerHTML = `
      Итого: <br/>
      <b>Выбранные Продукты</b>: ${arr2.reduce(
        (a, b) => a + ", " + b
      )} <br/> 
      <b>Чек</b> : ${arr.reduce((a, b) => a + b)} рублей`;
    });
  }
 <div>Яблоки: 200</div>
 <div>Вишни: 300</div>
 <div>Груши: 250</div>
 <p>Итого:</p>

Вроде бы все кривенько, но мне почему то нравится)

→ Ссылка