我的示例有一个摘要,我需要使用asc,desc转换对算法进行排序的最佳实践。此代码段根据工作具有许多复杂性,因为数组中始终需要字符串号。我如何简化此代码段。
const data = [['aaa','22'], ['aba','23'],['baa','12'],['caa','122']]
console.log(data)
console.log('\n')
var columnIndex = 0;
var order = 'DESC';
data.sort((a, b) => {
if (!Number.isInteger(Number.parseInt(a[columnIndex]))) {
if (a[columnIndex] < b[columnIndex]) {
return order === "ASC" ? -1 : 1;
}
if (a[columnIndex] > b[columnIndex]) {
return order === "ASC" ? 1 : -1;
}
return 0;
}
else {
return order === "ASC" ? (Number(a[columnIndex].match(/(\d+)/g)) - Number((b[columnIndex].match(/(\d+)/g)))) : ( Number((b[columnIndex].match(/(\d+)/g))) - Number(a[columnIndex].match(/(\d+)/g)));
}
});
console.log(data);
答案 0 :(得分:0)
您可以将部分应用程序与下面的sortBy()
之类的咖喱函数一起使用来确定排序顺序和条件,而不必依赖全局变量。我什至在事件侦听器中提供了用法,该侦听器会在输入发生更改时自动更新输出:
const data = [['aaa', 22], ['aba', 23], ['baa', 12], ['caa', 122]];
const sortBy = (o, i) => (a, b) => (-(a[i] < b[i]) || +(a[i] > b[i])) * o;
function update () {
const [order, index] = Array.from(
document.querySelectorAll('select'),
input => Number(input.value)
);
const sort = sortBy(order, index);
document.querySelector('#json').textContent = JSON.stringify(data.sort(sort));
}
document.body.addEventListener('input', update);
update();
<select name="order" value="1">
<option value="1">Ascending</option>
<option value="-1">Descending</option>
</select>
<select name="index" value="0">
<option value="0">String</option>
<option value="1">Number</option>
</select>
<pre id="json"></pre>
这是my answer对Sort array of objects by string property value的修改,其中包含有关sortBy()
工作方式的更多解释。