如何使用 reduce() 计算数组中每一项的折扣?

How to calculate discount for each item of an array using reduce()?

我需要计算数组中每个项目的 15% 折扣和总数。

目前我有使用 reduce() 方法计算和显示所有商品总折扣的解决方案,但是我如何使用 reduce() 分别计算每个商品的折扣?有没有办法做到这一点,或者我应该使用不同的解决方案?

function getDomNodesBySelector(selector) {
  return Array.from(document.querySelectorAll(selector));
}

document.querySelector('.total__button').addEventListener('click', applyDiscount);

function applyDiscount() {
  let items = getDomNodesBySelector(".price-value");
  let numDiscount = 15;
  let totalValue = items.reduce((acc, cur) => acc + (1 - (numDiscount / 100)) * cur.innerText, 0);
  document.querySelector(".total-price-value").innerText = totalValue;
}
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Корзина заказов</title>
    <link rel="stylesheet" href="https://code.s3.yandex.net/web-code/entrance-test/lesson-2/task-2/fonts.css">
    <link rel="stylesheet" href="style.css">
  </head>
  <body class="page">
  <h1 class="page__title">Корзина</h1>
  <section class="chosen-items">
    <article class="card">
      <img src="https://code.s3.yandex.net/web-code/entrance-test/jacket.png" alt="" class="card__image">
      <div class="card__description">
        <h2 class="card__title">Have A Good Time x FA Two Tone куртка</h2>
        <p class="card__text">Цвет: Зеленый/Оранжевый</p>
        <p class="card__text">Размер: M</p>
        <p class="card__text">Количество: 1</p>
      </div>
      <div class="card__price">
        <p class="card__rub price-default"><span class="price-value">15890</span> руб.</p>
      </div>
    </article>
    <article class="card">
      <img src="https://code.s3.yandex.net/web-code/entrance-test/vans.png" alt="" class="card__image">
      <div class="card__description">
        <h2 class="card__title">Vans Old Skool кеды</h2>
        <p class="card__text">Цвет: Черный/Белый</p>
        <p class="card__text">Размер: 43</p>
        <p class="card__text">Количество: 1</p>
      </div>
      <div class="card__price">
        <p class="card__rub price-default"><span class="price-value">6390</span> руб.</p>
      </div>
    </article>
    <article class="card">
      <img src="https://code.s3.yandex.net/web-code/entrance-test/pop-DRS.png" alt="" class="card__image">
      <div class="card__description">
        <h2 class="card__title">Pop DRS Denim Stonewashed джинсы</h2>
        <p class="card__text">Цвет: Голубой</p>
        <p class="card__text">Размер: S</p>
        <p class="card__text">Количество: 1</p>
      </div>
      <div class="card__price">
        <p class="card__rub price-default"><span class="price-value">11290</span> руб.</p>
      </div>
    </article>
    <article class="card">
      <img src="https://code.s3.yandex.net/web-code/entrance-test/by-parra.png" alt="" class="card__image">
      <div class="card__description">
        <h2 class="card__title">By Parra ремень</h2>
        <p class="card__text">Цвет: Мульти</p>
        <p class="card__text">Размер: S</p>
        <p class="card__text">Количество: 1</p>
      </div>
      <div class="card__price">
        <p class="card__rub price-default"><span class="price-value">8550</span> руб.</p>
      </div>
    </article>
    <article class="card">
      <img src="https://code.s3.yandex.net/web-code/entrance-test/board.png" alt="" class="card__image">
      <div class="card__description">
        <h2 class="card__title">Fucking Awesome Drawings 2 Pink доска</h2>
        <p class="card__text">Цвет: Розовый флюросентный</p>
        <p class="card__text">Размер: Один размер</p>
        <p class="card__text">Количество: 1</p>
      </div>
      <div class="card__price">
        <p class="card__rub price-default"><span class="price-value">4790</span> руб.</p>
      </div>
    </article>
  </section>
  <section class="total page__total">
    <button class="total__button">Использовать купон на 15%</button>
    <div class="total__prices">
      <h2 class="total__title">Итого:</h2>
      <p class="total__rub price-default"><span class="total-price-value">46910</span> руб.</p>
    </div>
  </section>
  <script src="./task.js"></script>
  </body>
</html>

类似

function getSingleValue(){

   var single = document.querySelector('.price-value').textContent;
   return single;

}

console.log(getSingleValue())

应该给你一个数组,其中包含 html 中的各个价格,然后你就可以使用

在循环遍历价格项目数组时,使用 reduce,您已经在访问每个项目元素并计算每个项目的折扣价。所以在更新 reduce 累加器之前更新项目值。

更新每一项并添加到总数中:

// CHANGE:
// let totalValue = items.reduce((acc, cur) => acc + (1 - (numDiscount / 100)) * cur.innerText, 0);

// TO:
let totalValue = items.reduce((acc, cur) => {
    let itemdisc = (1 - (numDiscount / 100)) * cur.innerText; // calculate item discount
    cur.innerText = itemdisc; // update item
    return acc + itemdisc; // update total
}, 0);

并防止再次应用折扣:

document.querySelector('.total__button').disabled = true;

更新的脚本:

function getDomNodesBySelector(selector) {
  return Array.from(document.querySelectorAll(selector));
}

document.querySelector('.total__button').addEventListener('click', applyDiscount);

function applyDiscount() {
  let items = getDomNodesBySelector(".price-value");
  let numDiscount = 15;
  let totalValue = items.reduce((acc, cur) => {
      let itemdisc = (1 - (numDiscount / 100)) * cur.innerText; // calculate item discount
      cur.innerText = itemdisc; // update item
      return acc + itemdisc; // update total
  }, 0);
  document.querySelector(".total-price-value").innerText = totalValue;

  // prevent discount from being applied more than once
  document.querySelector('.total__button').disabled = true;
}