isotope сортировка по определенному имени

292
02 марта 2019, 15:50

Есть isotope список:

// init Isotope 
var $grid = $('.grid').isotope({ 
  itemSelector: '.element-item', 
  layoutMode: 'fitRows', 
  getSortData: { 
    date: function ( itemElem  ) { 
              return Date.parse($( itemElem ).find('.date').data('time')); 
          }, 
          popular: function ( itemElem  ) { 
              return parseInt($( itemElem ).find('.comment').data('comment'), 10); 
          }, 
          name1: function ( itemElem  ) { 
              return $( itemElem ).find('.name1'); 
          }, 
          name2: function ( itemElem  ) { 
              return $( itemElem ).find('.name2'); 
          }, 
          name3: function ( itemElem  ) { 
              return $( itemElem ).find('.name3'); 
          }, 
  }, 
  sortAscending: false, 
  // sortBy: 'new', 
}); 
 
// bind sort button click 
$('.sort-by-button-group').on( 'click', 'button', function() { 
  var sortValue = $(this).attr('data-sort-value'); 
  $grid.isotope({ sortBy: sortValue }); 
}); 
 
// change is-checked class on buttons 
$('.button-group').each( function( i, buttonGroup ) { 
  var $buttonGroup = $( buttonGroup ); 
  $buttonGroup.on( 'click', 'button', function() { 
    $buttonGroup.find('.is-checked').removeClass('is-checked'); 
    $( this ).addClass('is-checked'); 
  }); 
});
.element-item { 
  border:1px solid #eee; 
  width: 100%; 
  padding-left: 1rem; 
  font-family: monospace; 
} 
 
.date { 
  display: block; 
  color:#777; 
  margin-bottom: 1rem; 
} 
 
.comment { 
  display: block; 
  margin-bottom: 1rem; 
} 
 
button.is-checked { 
  background: #000; 
  color: #fff; 
}
<script src="https://code.jquery.com/jquery-2.2.4.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.isotope/3.0.6/isotope.pkgd.min.js"></script> 
   
   
   
<div class="button-group sort-by-button-group"> 
  <button class="button is-checked" data-sort-value="original-order">ALL</button> 
  <button class="button" data-sort-value="date">New</button> 
  <button class="button" data-sort-value="popular">Popular</button> 
  <button class="button" data-sort-value="name1">Name 1</button> 
  <button class="button" data-sort-value="name2">Name 2</button> 
  <button class="button" data-sort-value="name3">Name 3</button> 
</div>   
 
 
<div class="grid"> 
  <div class="element-item " data-category="it 1"> 
    <h3 class="name name1">Name 1</h3> 
    <span class="date" data-time="02-07-2017">02.07.2017</span> 
    <span class="comment" data-comment="1">1 comment</span> 
  </div> 
  <div class="element-item " data-category="it 2"> 
    <h3 class="name name2">Name 2</h3> 
    <span class="date" data-time="01-01-2018T08:23:11">01.01.2018 08:23:11</span> 
    <span class="comment" data-comment="20">20 comments</span> 
  </div> 
  <div class="element-item " data-category="it 3"> 
    <h3 class="name name3">Name 3</h3> 
    <span class="date" data-time="05-07-2017">05.07.2017</span> 
    <span class="comment" data-comment="33">33 comments</span> 
  </div> 
  <div class="element-item " data-category="it 1"> 
    <h3 class="name name1">Name 1</h3> 
    <span class="date" data-time="20-03-2018T08:23:11">20.03.2018 08:23:11</span> 
    <span class="comment" data-comment="100">100 comments</span> 
  </div> 
  <div class="element-item " data-category="it 2"> 
    <h3 class="name name2">Name 2</h3> 
    <span class="date" data-time="14-10-2017">14.10.2017</span> 
    <span class="comment" data-comment="5">5 comment</span> 
  </div> 
  <div class="element-item " data-category="it 3"> 
    <h3 class="name name3">Name 3</h3> 
    <span class="date" data-time="07-06-2018">07.06.2018</span> 
    <span class="comment" data-comment="1">1 comment</span> 
  </div> 
  <div class="element-item " data-category="it 1"> 
    <h3 class="name name1">Name 1</h3> 
    <span class="date" data-time="01-09-2017">01.09.2017</span> 
    <span class="comment" data-comment="1">1 comment</span> 
  </div> 
  <div class="element-item " data-category="it 2"> 
    <h3 class="name name2">Name 2</h3> 
    <span class="date" data-time="11-11-2017">11.11.2017</span> 
    <span class="comment" data-comment="3">3 comments</span> 
  </div> 
  <div class="element-item " data-category="it 3"> 
    <h3 class="name name3">Name 3</h3> 
    <span class="date" data-time="03-04-2018">03.04.2018</span> 
    <span class="comment" data-comment="26">26 comments</span> 
  </div> 
</div>

Вопрос: Как отсортировать список по определенному имени, т.е. например сначала только все Name 1, а потом все остальные?

Вопрос: Как отсортировать по дате (формат DD-MM-YYTHH:MM:SS, пример 01-01-2018T08:23:11)?

Не отфильтровать, а именно отсортировать и именно isotope!

P.S: Сейчас из всех пунктов срабатывает только сортировка популярных постов. Сортировка остальных как-то странно срабатывает (не так как положено).

Answer 1

Проблема с датами заключается в неверном формате строки, которая передается в метод Date.parse

Если привести ее к ISO формату: yyyy-mm-dd, то сортировка по дате начнет работать корректно.

Сейчас же идет попытка распознать дату: 20.03.2018 по формату mm.dd.yyyy из-за этого получается 20 месяц, что некорректно, и, как следствие, результат вызова parse - NaN.

Для сортировки по имени - нужно определить как сравнивать элементы.

Так как имя задается элементом с конкретным классом, самое простое - просто проверить наличие этого элемента, например вернув .length - в нужных элементах он будет 1, и они будут вверху, так как в остальных он будет 0 из-за отсутствия элемента с нужным классом.

Либо воспользоваться методом has

// init Isotope 
var $grid = $('.grid').isotope({ 
  itemSelector: '.element-item', 
  layoutMode: 'fitRows', 
  getSortData: { 
    date: function(itemElem) { 
      return Date.parse($(itemElem).find('.date').data('time')); 
    }, 
    popular: function(itemElem) { 
      return parseInt($(itemElem).find('.comment').data('comment'), 10); 
    }, 
    name1: function(itemElem) { 
      return $(itemElem).find('.name1').length; 
    }, 
    name2: function(itemElem) { 
      return $(itemElem).find('.name2').length; 
    }, 
    name3: function(itemElem) { 
      return $(itemElem).find('.name3').length; 
    }, 
  }, 
  sortAscending: false, 
  // sortBy: 'new', 
}); 
 
// bind sort button click 
$('.sort-by-button-group').on('click', 'button', function() { 
  var sortValue = $(this).attr('data-sort-value'); 
  $grid.isotope({ 
    sortBy: sortValue 
  }); 
}); 
 
// change is-checked class on buttons 
$('.button-group').each(function(i, buttonGroup) { 
  var $buttonGroup = $(buttonGroup); 
  $buttonGroup.on('click', 'button', function() { 
    $buttonGroup.find('.is-checked').removeClass('is-checked'); 
    $(this).addClass('is-checked'); 
  }); 
});
.element-item { 
  border: 1px solid #eee; 
  width: 100%; 
  padding-left: 1rem; 
  font-family: monospace; 
} 
 
.date { 
  display: block; 
  color: #777; 
  margin-bottom: 1rem; 
} 
 
.comment { 
  display: block; 
  margin-bottom: 1rem; 
} 
 
button.is-checked { 
  background: #000; 
  color: #fff; 
}
<script src="https://code.jquery.com/jquery-2.2.4.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.isotope/3.0.6/isotope.pkgd.min.js"></script> 
 
 
 
<div class="button-group sort-by-button-group"> 
  <button class="button is-checked" data-sort-value="original-order">ALL</button> 
  <button class="button" data-sort-value="date">New</button> 
  <button class="button" data-sort-value="popular">Popular</button> 
  <button class="button" data-sort-value="name1">Name 1</button> 
  <button class="button" data-sort-value="name2">Name 2</button> 
  <button class="button" data-sort-value="name3">Name 3</button> 
</div> 
 
 
<div class="grid"> 
  <div class="element-item " data-category="it 1"> 
    <h3 class="name name1">Name 1</h3> 
    <span class="date" data-time="2017-07-02">02.07.2017</span> 
    <span class="comment" data-comment="1">1 comment</span> 
  </div> 
  <div class="element-item " data-category="it 2"> 
    <h3 class="name name2">Name 2</h3> 
    <span class="date" data-time="2018-01-01T08:23:11">01.01.2018 08:23:11</span> 
    <span class="comment" data-comment="20">20 comments</span> 
  </div> 
  <div class="element-item " data-category="it 3"> 
    <h3 class="name name3">Name 3</h3> 
    <span class="date" data-time="2017-07-05">05.07.2017</span> 
    <span class="comment" data-comment="33">33 comments</span> 
  </div> 
  <div class="element-item " data-category="it 1"> 
    <h3 class="name name1">Name 1</h3> 
    <span class="date" data-time="2018-03-20T08:23:11">20.03.2018 08:23:11</span> 
    <span class="comment" data-comment="100">100 comments</span> 
  </div> 
  <div class="element-item " data-category="it 2"> 
    <h3 class="name name2">Name 2</h3> 
    <span class="date" data-time="2017-10-14">14.10.2017</span> 
    <span class="comment" data-comment="5">5 comment</span> 
  </div> 
  <div class="element-item " data-category="it 3"> 
    <h3 class="name name3">Name 3</h3> 
    <span class="date" data-time="2018-06-07">07.06.2018</span> 
    <span class="comment" data-comment="1">1 comment</span> 
  </div> 
  <div class="element-item " data-category="it 1"> 
    <h3 class="name name1">Name 1</h3> 
    <span class="date" data-time="2017-09-01">01.09.2017</span> 
    <span class="comment" data-comment="1">1 comment</span> 
  </div> 
  <div class="element-item " data-category="it 2"> 
    <h3 class="name name2">Name 2</h3> 
    <span class="date" data-time="2017-11-11">11.11.2017</span> 
    <span class="comment" data-comment="3">3 comments</span> 
  </div> 
  <div class="element-item " data-category="it 3"> 
    <h3 class="name name3">Name 3</h3> 
    <span class="date" data-time="2018-04-03">03.04.2018</span> 
    <span class="comment" data-comment="26">26 comments</span> 
  </div> 
</div>

Answer 2

const buttons = document.querySelector('.sort-by-button-group'); 
const grid = document.getElementsByClassName('grid')[0]; 
const children = grid.children; 
const originalOrder = [] 
buttons.addEventListener('click', sorting); 
 
for (let i=0; i<children.length; i++) { 
	originalOrder[i] = children[i] 
} 
 
function sorting(event) { 
const target = event.target 
const value = target.dataset.sortValue; 
const sortList = [] 
for (let i=0; i<children.length; i++) { 
	sortList[i] = children[i] 
} 
sortList.sort((a,b) => { 
	if (value != "original-order" && value != "category") { 
		return (a.classList.contains(value)) ? -1 : 1 
	} 
	if (value === "category") { 
		return a.dataset.category < b.dataset.category 
	} 
}) 
grid.innerHTML = ""; 
sortList.forEach((item) => { 
	grid.appendChild(item) 
}) 
if (value === "original-order") { 
		originalOrder.forEach((item) => { 
		grid.appendChild(item) 
	}) 
} 
}
.element-item { 
  width: 100%; 
  border:1px solid #333; 
}
<script src="https://code.jquery.com/jquery-2.2.4.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.isotope/3.0.6/isotope.pkgd.min.js"></script> 
   
   
<div class="button-group sort-by-button-group"> 
  <button class="button is-checked" data-sort-value="original-order">original order</button> 
  <button class="button" data-sort-value="mercury">Mercury</button> 
  <button class="button" data-sort-value="tellurium">Tellurium</button> 
  <button class="button" data-sort-value="category">category</button> 
</div> 
 
<div class="grid"> 
  <div class="element-item transition metal mercury" data-category="transition"> 
    <h3 class="name">Mercury</h3> 
    <p class="symbol">Hg</p> 
    <p class="number">80</p> 
    <p class="weight">200.59</p> 
  </div> 
  <div class="element-item metalloid tellurium" data-category="metalloid"> 
    <h3 class="name">Tellurium</h3> 
    <p class="symbol">Te</p> 
    <p class="number">52</p> 
    <p class="weight">127.6</p> 
  </div> 
  <div class="element-item transition metal mercury" data-category="transition"> 
    <h3 class="name">Mercury</h3> 
    <p class="symbol">Hg</p> 
    <p class="number">80</p> 
    <p class="weight">200.59</p> 
  </div> 
  <div class="element-item metalloid tellurium" data-category="metalloid"> 
    <h3 class="name">Tellurium</h3> 
    <p class="symbol">Te</p> 
    <p class="number">52</p> 
    <p class="weight">127.6</p> 
  </div> 
</div>

READ ALSO
mysql_fetch_array не работает

mysql_fetch_array не работает

и тоже не работает в mysql_fetch_row и mysqli_fetch_arrayЧто нужно делать

205
Как сделать карусель адаптивной и под ПК и под смартфон?

Как сделать карусель адаптивной и под ПК и под смартфон?

Дорогие друзья! Столкнулся с такой проблемой: Есть карусель а изображения на ней разного размераВысота некоторых изображений больше, и когда...

204
Непонятное поведение SVG

Непонятное поведение SVG

у меня следующая проблема в проекте использую SVG файл через object, вот шапка svg'шника и элемента object со страницы:

202