function getSortKey(item) {
// simular algo demorado
for (var i = 0; i < 1000; i++) {}
return parseInt(item);
}
var array = [];
for (var i = 0; i < 100000; i++) {
var x = Math.random() * 100000;
array.push(x.toString());
}
var computed = {};
function getSortKeyMem(item) {
if (!computed[item]) {
for (var i = 0; i < 1000; i++) {}
computed[item] = parseInt(item);
}
return computed[item];
}
for (let i = 0; i < array.length; i++) {
array[i] = [array[i], getSortKey(array[i])];
}
array.sort((a, b) => a[1] - b[1]);
for (let i = 0; i < array.length; i++) {
array[i] = array[i][0];
}
array = array
// decorate: computa a chave para cada elemento e guarda no prĂ³prio array
.map(e => [e, getSortKey(e)])
// ordena usando o valor computado
.sort((a, b) => a[1] - b[1])
// undecorate: remove as chaves, deixando apenas os elementos originais
.map(e => e[0]);
for (let i = 0; i < array.length; i++) {
array[i] = { original: array[i], sortKey: getSortKey(array[i]) };
}
array.sort((a, b) => a.sortKey - b.sortKey);
for (let i = 0; i < array.length; i++) {
array[i] = array[i].original;
}
array.sort((a, b) => getSortKey(a) - getSortKey(b));
array.sort((a, b) => getSortKeyMem(a) - getSortKeyMem(b));