Подскажите как реализовать сортировку по цене.
Выбираю по ClassName .appartments-item__price'.
Получаю массив. Сортировать методом sort
. Тут уже выдает ошибку что unexpected token { на строке prices.sort(a, b).
А как потом сослаться на .appartments-item
, чтобы карточки выстроились по новому?
Это же тоже надо учитывать при сортировке?
document.querySelector('.sorting__price').onclick = function() {
let prices = document.getElementsByClassName('.appartments-item__price');
prices.sort(a, b) {
if (a > b)
return -1;
if (a < b)
return 1;
if (a == b)
return 0;
};
};
<article class="appartments-item" tabindex="0">
<h2 class="appartments-item__title">Студия №44</h2>
<div class="appartments-item__price">5 000 000 руб</div>
<footer class="appartments-item__footer appartments-footer">
<span class="appartments-footer__text--free">Свободно</span>
<span class="appartments-footer__text--reserved">Забронировано</span>
</footer>
<div class="appartments-item__star"></div>
</article>
<article class="appartments-item" tabindex="0">
<h2 class="appartments-item__title">Однокомнатная №666</h2>
<div class="appartments-item__price">16 000 000 руб</div>
<footer class="appartments-item__footer appartments-footer">
<span class="appartments-footer__text--free">Свободно</span>
<span class="appartments-footer__text--reserved">Забронировано</span>
</footer>
<div class="appartments-item__star"></div>
</article>
document.querySelector('.sorting__price').addEventListener("click", () => {
const elements = document.querySelectorAll('.appartments-item');
const sorted = [...elements].sort((a, b) => {
const priceElA = a.querySelector(".appartments-item__price");
const priceElB = b.querySelector(".appartments-item__price");
const getPrice = (el) => parseInt(el.innerHTML.replace(/ /g, ""));
return getPrice(priceElA) - getPrice(priceElB);
});
const resultEl = document.querySelector(".results-container");
resultEl.innerHTML = null;
sorted.forEach(el => resultEl.appendChild(el));
});
.results-container {
background-color: #ffddcc;
}
<button class="sorting__price">Sort</button>
<article class="appartments-item" tabindex="0">
<h2 class="appartments-item__title">Однокомнатная №666</h2>
<div class="appartments-item__price">16 000 000 руб</div>
<footer class="appartments-item__footer appartments-footer">
<span class="appartments-footer__text--free">Свободно</span>
<span class="appartments-footer__text--reserved">Забронировано</span>
</footer>
<div class="appartments-item__star"></div>
</article>
<article class="appartments-item" tabindex="0">
<h2 class="appartments-item__title">Студия №44</h2>
<div class="appartments-item__price">5 000 000 руб</div>
<footer class="appartments-item__footer appartments-footer">
<span class="appartments-footer__text--free">Свободно</span>
<span class="appartments-footer__text--reserved">Забронировано</span>
</footer>
<div class="appartments-item__star"></div>
</article>
<div class="results-container"></div>
Если игнорировать семантику HTML с несколькими <footer>
обернутыми в <article>
, то чисто JS должен быть примерно таким:
addEventListener
, так как при этом Вы не удаляете остальные listeners, как в случае el.onclick = func
querySelector
, то используйте его везде и не смешивайте с getElement
методами без лишней необходимости. Разницы (почти) никакой, вопрос в читабельности.forEach
, map
, sort
, etc. Чтобы добавить их, достаточно использовать деструктуризацию [...elements]
.sort принимает один аргумент, функцию, определяющую порядок сортировки. Пруфы тут.
function callback(evt) {
var list = document.getElementById('wrapper');
var items = list.childNodes;
var itemsArr = [];
for (var i in items) {
if (items[i].nodeType == 1) {
itemsArr.push(items[i]);
}
}
itemsArr.sort(function(a, b) {
return parseFloat(a.getAttribute('price')) == parseFloat(b.getAttribute('price')) ?
0 :
(parseFloat(a.getAttribute('price')) > parseFloat(b.getAttribute('price')) ? 1 : -1);
});
for (i = 0; i < itemsArr.length; ++i) {
list.appendChild(itemsArr[i]);
}
}
document.getElementById('sort').addEventListener('click', callback);
<div id="wrapper">
<article class="appartments-item" tabindex="0" price="5000000">
<h2 class="appartments-item__title">Студия №44</h2>
<div class="appartments-item__price">5 000 000 руб</div>
<footer class="appartments-item__footer appartments-footer">
<span class="appartments-footer__text--free">Свободно</span>
<span class="appartments-footer__text--reserved">Забронировано</span>
</footer>
<div class="appartments-item__star"></div>
</article>
<article class="appartments-item" tabindex="0" price="16000000">
<h2 class="appartments-item__title">Однокомнатная №666</h2>
<div class="appartments-item__price">16 000 000 руб</div>
<footer class="appartments-item__footer appartments-footer">
<span class="appartments-footer__text--free">Свободно</span>
<span class="appartments-footer__text--reserved">Забронировано</span>
</footer>
<div class="appartments-item__star"></div>
</article>
<article class="appartments-item" tabindex="0" price="5000">
<h2 class="appartments-item__title">Студия №41</h2>
<div class="appartments-item__price">5 000 руб</div>
<footer class="appartments-item__footer appartments-footer">
<span class="appartments-footer__text--free">Свободно</span>
<span class="appartments-footer__text--reserved">Забронировано</span>
</footer>
<div class="appartments-item__star"></div>
</article>
</div>
<button id="sort">Sort</button>
Виртуальный выделенный сервер (VDS) становится отличным выбором
При помощи jquery необходимо взять значение data из выбранного optionПытался сделать при помощи selected, но он берет самый первый option на котором саморучно...
У меня возник вопрос по перемещению объекта в юнитиУ меня есть платформа которая может ездить по 2 направлающим(одна в носе платформы, друга...
Есть простейший класс, не могу понять почему не могу сослаться на ранее созданный объект?