Итак, у меня есть этот код
var $divs = $("div.product");
$('#priceAscending').on('click', function() {
var ascendingOrderedDivs = $divs.sort(function(a, b) {
return $(a).find("div.price").text() > $(b).find("div.price").text();
});
$("#container").html(ascendingOrderedDivs);
});<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "wrap">
<button id = "priceAscending">Price ascending</button>
<!--<button id = "priceDescending">Price descending</button>-->
<div id = "container">
<div class = "product">
<span id = "name">Product One</span>
<div class = "price">14.85$</div>
</div>
<div class = "product">
<span id = "name">Product Two</span>
<div class = "price">27.59$</div>
</div>
<div class = "product">
<span id = "name">Product Three</span>
<div class = "price">2.64$</div>
</div>
</div>
</div>Я хочу отсортировать div.product в порядке возрастания по цене, но это не работает. Он помещает 2,64 в середину, но должен ставить его первым.
Как я могу исправить эту проблему с помощью jQuery?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам нужно сменить > на -
return $(a).find("div.price").text() - $(b).find("div.price").text();
Вам также необходимо убрать $ из цены, чтобы сравнить значения. Вы можете сделать это с помощью str.slice(0, -1)
return $(a).find("div.price").text().slice(0, -1) - $(b).find("div.price").text().slice(0, -1);
Вот рабочий JSFiddle
Просто переверните логику. Вместо a - b вы делаете b - a. Здесь вы можете найти много интересных способов использования sort() в JS.
То, что сказал Миракурун, вероятно, является лучшим решением, но что мне нравится делать, если мне нужен какой-то переключатель сортировки, - это добавить *-1, если он спускается, что в основном делает то же самое, но его легче условно изменить.
Я предлагаю использовать числовое значение вместо строки
var divs = $("div.product");
$('#priceAscending').on('click', function() {
var ascendingOrderedDivs = divs.sort(function(a, b) {
var aVal = parseFloat($(a).find("div.price").text().replace("$",""));
var bVal = parseFloat($(b).find("div.price").text().replace("$",""));
return aVal - bVal;
});
$("#container").html(ascendingOrderedDivs);
});<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "wrap">
<button id = "priceAscending">Price ascending</button>
<!--<button id = "priceDescending">Price descending</button>-->
<div id = "container">
<div class = "product">
<span id = "name">Product One</span>
<div class = "price">14.85$</div>
</div>
<div class = "product">
<span id = "name">Product Two</span>
<div class = "price">27.59$</div>
</div>
<div class = "product">
<span id = "name">Product Three</span>
<div class = "price">2.64$</div>
</div>
</div>
</div>Вы можете заменить $ в конце цен пустой строкой и использовать parseFloat для сравнения значений. Обратите внимание, что id на странице должен быть уникальным. Для всех пролетов вы используете id = "name
var $divs = $("div.product");
$('#priceAscending').on('click', function() {
var ascendingOrderedDivs = $divs.sort(function(a, b) {
return parseFloat($(a).find("div.price").text().replace(/\$$/, '')) - parseFloat($(b).find("div.price").text().replace(/\$$/, ''));
});
$("#container").html(ascendingOrderedDivs);
});<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "wrap">
<button id = "priceAscending">Price ascending</button>
<!--<button id = "priceDescending">Price descending</button>-->
<div id = "container">
<div class = "product">
<span id = "name">Product One</span>
<div class = "price">14.85$</div>
</div>
<div class = "product">
<span id = "name">Product Two</span>
<div class = "price">27.59$</div>
</div>
<div class = "product">
<span id = "name">Product Three</span>
<div class = "price">2.64$</div>
</div>
</div>
</div>
Спасибо, что помогли мне, а как насчет заказа по убыванию?