Метод sort() некорректно отрабатывает в google chrome при сравнении чисел из двух массивов
Всем привет!
Я только начинающий и сейчас делаю работу для портфолио, так что, пожалуйста, если что не судите строго)
Собственно, задача заключается в следующем: нужно сделать сортировку товаров по якобы дате их добавления и сделать это только из числа товаров, уже отсортированных по категориям.
Саму дату я прописал каждому товару в атрибуте data-time в виде "год-месяц-число".
Пример:
<div class="products__item jsFilterItem" data-time="2011-05-17" data-cat="автомодели">
<div class="products__header">
<a href="#">
<img class="img" src="assets/img/products/product1.png" alt="Игрушка"/>
</a>
<div class="products__price">
<span class="jsPrice" data-price="18480">18 480</span> р.
</div>
</div>
<div class="products__footer">
<a class="products__link" href="#">CYCLONE D4 WORLD CHAMPIONSHIP EDITION KIT</a>
</div>
</div>
Решение этой задачи я попробовал сделать с помощью метода sort(), получив у каждого товара из сравниваемой пары значение атрибута data-time, разбив его на массив, преобразовав каждый элемент массива в число и осуществив сравнение.
Вот сам скрипт:
function filterDate() {
var productsSortedOnCategories = [];
var productsLength = products.length;
for( var i = 0; i < productsLength; i++ ) {
if( !$(products[i]).hasClass('hide') ) {
productsSortedOnCategories.push(products[i]);
$(products[i]).remove();
}
}
var productsDateArray = [].slice.call(productsSortedOnCategories); // Копирование продуктов в настоящий массив.
if( $('.jsFilterDate').hasClass('sorted') ) {
sortProductsDateDescending();
} else {
sortProductsDateAscending();
}
function sortProductsDateAscending() {
productsDateArray.sort(function( a, b ) {
var firstProductAttrValueInArray = $(a).data('time').split('-');
var fDateValueNumbType = [];
for( var i = 0; i < 3; i++ ) {
fDateValueNumbType.push(Number(firstProductAttrValueInArray[i]));
}
var secProductAttrValueInArray = $(b).data('time').split('-');
var sDateValueNumbType = [];
for( var i = 0; i < 3; i++ ) {
sDateValueNumbType.push(Number(secProductAttrValueInArray[i]));
}
if( fDateValueNumbType[0] - sDateValueNumbType[0] ) {
return 1;
} else if( fDateValueNumbType[1] - sDateValueNumbType[1] ) {
return 1;
} else if( fDateValueNumbType[2] - sDateValueNumbType[2] ) {
return 1;
}
});
$(productsContainer).append(productsDateArray);
}
}
В mozilla firefox все срабатывает как нужно. Но в хроме и опере нет.
В интернете увидел, что в большинстве случаев проблема возникает, когда сравнение на самом деле происходит между строками, а не числами. Но я этот момент проверил, элементы массивов все-таки становится числами после преобразования.
Может быть знаете как решить проблему? Пожалуйста, подскажите.
Ответы (1 шт):
Исправил код таким образом, как и посоветовал @Stepan Kasyanenko: изменил условия и дописал возвращение -1 и 0.
В таком виде метод sort() заработал корректно:
if( fDateValueNumbType[0] < sDateValueNumbType[0] ) return -1;
if( fDateValueNumbType[0] > sDateValueNumbType[0] ) return 1;
if( fDateValueNumbType[0] == sDateValueNumbType[0] ) {
if( fDateValueNumbType[1] < sDateValueNumbType[1] ) return -1;
if( fDateValueNumbType[1] > sDateValueNumbType[1] ) return 1;
if( fDateValueNumbType[1] == sDateValueNumbType[1] ) {
if( fDateValueNumbType[2] < sDateValueNumbType[2] ) return -1;
if( fDateValueNumbType[2] > sDateValueNumbType[2] ) return 1;
if( fDateValueNumbType[2] == sDateValueNumbType[2] ) {
return 0;
}
}
}