• Как отсортировать данные в динамически созданной таблице?

    Dr_Elvis
    @Dr_Elvis
    В гугле забанен
    Я использую вот такой скрипт для сортировки таблицы
    function sorttbl(head, selector, numrow, dtype) {
        let table, rows, switching, i, x, y, xx, yy, shouldSwitch, dir, switchcount = 0;
        table = document.querySelector(selector);
        switching = true;
        dir = "asc";
        while (switching) {
            switching = false;
            rows = table.rows;
            for (i = head; i < (rows.length - 1); i++) {
                shouldSwitch = false;
                x = rows[i].getElementsByTagName("TD")[numrow];
                y = rows[i + 1].getElementsByTagName("TD")[numrow];
                if (dtype == "num") {
                    xx = parseFloat(x.innerHTML);
                    yy = parseFloat(y.innerHTML);
                } else {
                    xx = x.innerHTML.toLowerCase();
                    yy = y.innerHTML.toLowerCase();
                }
                if (dir == "asc") {
                    if (xx > yy) {
                        shouldSwitch = true;
                        break;
                    }
                } else if (dir == "desc") {
                    if (xx < yy) {
                        shouldSwitch = true;
                        break;
                    }
                }
            }
            if (shouldSwitch) {
                rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
                switching = true;
                switchcount++;
            } else {
                if (switchcount == 0 && dir == "asc") {
                    dir = "desc";
                    switching = true;
                }
            }
        }
    }

    Далее где нужно вешаю вызов функции(обычно на заголовках таблицы).
    Поясню параметры:
    head - если таблица имеет заголовок, то ставим 1, иначе 0
    selector - селектор CSS для таблицы который нужно сортировать, именно для тега table
    numrow - номер столбца по которому будет сортировка в таблице, начинается отсчет с 0
    dtype - тип данных в столбце. если цифры, то ставим 'num', если текст, то 'text'

    Для примера: https://codepen.io/Dr_Elvis/pen/KKQmWKp
    Ответ написан
    Комментировать
  • Как заполнить в каждом объекте поле рандомно значениями из массива?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    users.forEach(user => {
      user.active = activeUsers[Math.floor(Math.random() * activeUsers.length)];
    });
    Ответ написан
    Комментировать
  • Почему в корзине считается только последний discount?

    0xD34F
    @0xD34F Куратор тега JavaScript
    for (let i in goods) {
      if (discounts.length === 0) {
        count = goods[i].value * goods[i].amount;
      }
      for (let j in discounts) {
        if (goods[i].name === discounts[j].name) {
          count =
            (goods[i].value - goods[i].value * discounts[j].discount) *
            goods[i].amount;
        } else {
          count = goods[i].value * goods[i].amount;
        }
      }
      sum += count;
      console.log(count, goods[i].name);
    }

    Зачем на каждой итерации цикла, ищущего скидку, пересчитывать цену? Предположим, нашли скидку для текущего товара, что дальше? Дальше, на следующей итерации, цена будет рассчитана заново, но уже без скидки - ведь объект скидки будет другим, будет соответствовать другому товару. Исключение - если скидка найдена на последней итерации.

    Правильно будет вычислять до цикла сумму без скидки, искать в цикле скидку, если нашли - пересчитывать со скидкой, прерывать цикл:

    for (const n of goods) {
      let s = n.value * n.amount;
      for (const m of discounts) {
        if (n.name === m.name) {
          s *= 1 - m.discount;
          break;
        }
      }
      sum += s;
    }

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

    function totalCost(goods, discounts) {
      discounts = Object.fromEntries(discounts.map(n => [ n.name, 1 - parseFloat(n.discount) / 100 ]));
      return goods.reduce((acc, n) => acc + n.value * n.amount * (discounts[n.name] ?? 1), 0);
    }
    Ответ написан
    3 комментария