В JavaScript есть в прототипе массива традиционная для всех функция sort().
Для примера сделаем такую табличку:
<a href="javascript:" data-sort="alphabet">sort by alpabet</a>
<a href="javascript:" data-sort="amount">sort by amount</a>
<div id="lst">
<div><span>jsghgori</span><span>345</span></div>
<div><span>ouerok</span><span>98</span></div>
<div><span>qiewhfh</span><span>548</span></div>
<div><span>nvxcmk</span><span>234</span></div>
<div><span>kefoo</span><span>38</span></div>
</div>
Теперь напичкаем её функционалом для сортировки и рисования:
<script>
var lst = document.getElementById('lst');
Object.defineProperties(lst, {
_direct: {
/**
* Направление сортировки
* 0 - a->z
* 1 - z->a
*/
value: 0,
writable: true
},
direct: {
get: function () {
return this._direct;
},
set: function (val) {
this._direct = Math.abs(this._direct - 1);
},
enumerable: true,
configurable: true
},
_dataArr: {
/* Массив с данными */
value: [],
writable: true,
},
data: {
/* Получить массив с данными */
get: function () {
let _that = this;
if (!this._dataArr.length) {
/* Если массив пуст, получим данные */
[].map.call(this.children, function (_row) {
let _dataRow = {
title: _row.children[0].innerHTML,
amount: parseInt(_row.children[1].innerHTML),
element: _row
}
_that._dataArr.push(_dataRow);
});
}
/* В любом случае возвертаем массив */
return this._dataArr;
}
},
sortByAlphabet: {
value: function () {
let _that = this;
this.data.sort(function (a, b) {
if (_that.direct) {
return a.title > b.title ? 1 : -1;
} else {
return a.title > b.title ? -1 : 1;
}
});
this.direct = true;
this.drawRows();
},
writable: false
},
sortByAmount: {
value: function () {
let _that = this;
this.data.sort(function (a, b) {
if (_that.direct) {
return a.amount > b.amount ? 1 : -1;
} else {
return a.amount > b.amount ? -1 : 1;
}
});
this.direct = true;
this.drawRows();
},
writable: false
},
drawRows: {
value: function () {
for (let i = 0; i < this.data.length; i++) {
this.appendChild(this.removeChild(this.data[i].element));
}
},
writable: false
}
});
document.addEventListener('click', function (ev) {
if (ev.target.hasAttribute('data-sort')) {
switch (ev.target.getAttribute('data-sort')) {
case 'alphabet':
lst.sortByAlphabet();
break;
case 'amount':
lst.sortByAmount();
break;
}
}
});
</script>
Весь цимес в lst.sortByAlphabet() и lst.sortByAmount(). То есть, sort() внутри себя перебирает все элементы массива со своим соседом, передавая их в аргументах, чем мы и пользуемся для сравнения их. Что сравнивать, решаем сами.