{ key: первый индекс, где встречается key }:const keyIndex = arr.reduce((acc, n, i) => (acc[n.key] ??= i, acc), {});id. Можно отсортировать существующий массив:arr.sort((a, b) => (keyIndex[a.key] - keyIndex[b.key]) || (a.id - b.id));const sorted = (arr, keys) => arr
.map(n => [ n ].concat(keys(n)))
.sort((a, b) => {
let diff = 0;
for (let i = 0; ++i < a.length && !(diff = a[i] - b[i]);) ;
return diff;
})
.map(n => n[0]);
const sortedArr = sorted(arr, n => [ keyIndex[n.key], n.id ]);
const reverse = num =>
+[...`${Math.abs(num)}`].reverse().join('');function reverse(num) {
let result = 0;
for (num *= Math.sign(num); num;) {
result = result * 10 + (num % 10);
num = Math.floor(num / 10);
}
return result;
}
function getWinner(points) {
const [ a, b ] = points.reduce((acc, n) => (
n.split('-').forEach((m, i) => acc[i] += +m),
acc
), [ 0, 0 ]);
return a === b
? undefined
: a < b ? 2 : 1;
}const getWinner = points =>
[ 2, , 1 ][-~Math.sign(eval(points.join('+')))];
Есть ли способ это сделать без потерь в деталях?
Object.values(data.reduce((acc, n) => {
(acc[n.code] ||= {
code: n.code,
name: n.name,
variants: [],
}).variants.push(n);
return acc;
}, {}))
const seq = [1];
let upper = 0;
let lower = 0;
const dblLinear = n => {
while (n >= seq.length) {
const y = seq[lower] * 2 + 1;
const z = seq[upper] * 3 + 1;
if (y < z) {
seq.push(y);
lower += 1;
}
else {
seq.push(z);
upper += 1;
}
}
return seq[n];
}[1, 3] – это оператор. Выражение во вторых квадратных скобках возвращает тройку, [3,2,2,8,5][3] возвращает элемент массива с индексом 3, то есть четвёртый по счёту, то есть 8.
const sorted = (arr, key) => arr
.map(n => [ key(n), n ])
.sort(([a], [b]) => a < b ? -1 : +(a > b))
.map(n => n[1]);const sortedArr = sorted(
arr,
n => new Date(n.date.replace(/(\d+)\.(\d+)\.(\d+)/, '$3-$2-$1'))
);
// или
const sortedArr = sorted(
arr,
n => n.date.split('.').reverse().map(m => m.padStart(2, 0)).join('')
);