#javascript
#javascript
Вопрос:
Привет,
У меня есть этот код для сортировки списка html:
function sortList(listid){
//some stuff
elms.sort(function(a, b){
if(a.dataset.age < b.dataset.age) { return minusone; }
if(a.dataset.age > b.dataset.age) { return plusone; }
return 0;
});
}
это работает нормально, но я хочу изменить его, чтобы я мог использовать переменные для работы с разными наборами данных:
function sortList(listid,type,direction){
//some stuff
var typesort = 'dataset'.type;
elms.sort(function(a, b){
if(a.typesort < b.typesort) return minusone;
if(a.typesort > b.typesort) return plusone;
return 0;
});
}
но это работает не так, как ожидалось, поскольку сортировка происходит повсюду. Вы можете увидеть это вживую здесь: http://jsfiddle.net/ocymgrL7/2 /
каков правильный синтаксис для достижения этой цели?
Спасибо.
Комментарии:
1. Вы хотели сказать,
a[typesort] < b[typesort]
?2. тоже не работает.
Ответ №1:
Если вы хотите сказать, что a
у него есть свойство dataset
, и это свойство, .dataset, имеет свойство age
, вы можете сказать a.dataset.age
ИЛИ вы можете сказать a.dataset[age]
// Sort the lis in descending order
elms.sort(function(a, b){
if(a.dataset[type] < b.dataset[type]) return minusone;
if(a.dataset[type] > b.dataset[type]) return plusone;
return 0;
});
См. Ссылку: обозначение в скобках
Ответ №2:
Вызов element.dataset.prop
не так уж и плох. Детализация вызова dataset
делает ваш код более читабельным.
Ваша сортировка может быть упрощена следующим образом. Имейте в виду, что это очень простой пример.
/**
* Sorts elements in-place.
* @param {String} selector - multi-element selector
* @param {Function} sorterFn - comparator function used for sorting
* @param {Number} [direction=1] - direction of sort (1 = ASC, -1 = DESC)
*/
const sortElements = (selector, sorterFn, direction = 1) => {
const elements = [...document.querySelectorAll(selector)];
const parentEl = elements[0].parentElement;
elements.sort((a, b) => sorterFn(a, b) * direction).forEach(el => parentEl.append(el));
}
// Sort by type then name and then reverse the entire sort.
sortElements('#list li', (a, b) =>
a.dataset.type.localeCompare(b.dataset.type) ||
a.textContent.trim().localeCompare(b.textContent.trim()), -1);
li[data-type="fruit"] { color: orange; }
li[data-type="vegetable"] { color: green; }
<ul id="list">
<li data-type="fruit">Apple</li>
<li data-type="vegetable">Broccoli</li>
<li data-type="vegetable">Carrot</li>
<li data-type="fruit">Orange</li>
<li data-type="fruit">Pear</li>
<li data-type="vegetable">Raddish</li>
</ul>
Вы можете проявить фантазию, разрешив компараторы vararg («переменный аргумент» с использованием оператора распространения):
/**
* Sorts elements in-place.
* @param {String} selector - multi-element selector
* @param {Function} sorterFn - comparator function used for sorting
* @param {Number} [direction=1] - direction of sort (1 = ASC, -1 = DESC)
*/
const sortElements = (selector, ...comparators) => {
const elements = [...document.querySelectorAll(selector)];
const parentEl = elements[0].parentElement;
elements.sort((a, b) => {
let res = 0;
for (let i = 0; i < comparators.length; i ) {
const { fn, dir = 'ASC' } = comparators[i];
res = fn(a, b) * (dir === 'DESC' ? -1 : 1);
if (res !== 0) return res;
}
return res;
}).forEach(el => parentEl.append(el));
}
// Sort by type then name (in reverse)
sortElements('#list li', {
fn: (a, b) => a.dataset.type.localeCompare(b.dataset.type)
}, {
fn: (a, b) => a.textContent.trim().localeCompare(b.textContent.trim()),
dir: 'DESC'
});
li[data-type="fruit"] { color: orange; }
li[data-type="vegetable"] { color: green; }
<ul id="list">
<li data-type="fruit">Apple</li>
<li data-type="vegetable">Broccoli</li>
<li data-type="vegetable">Carrot</li>
<li data-type="fruit">Orange</li>
<li data-type="fruit">Pear</li>
<li data-type="vegetable">Raddish</li>
</ul>