В обратном вызове .sort
сортировка по:
(1) Разница между хромосомами двух элементов составляет 'y'
(2) Разница между хромосомами двух элементов составляет 'x'
(3) Числовая c разница между хромосомами двух элементов
(4) Числовая c разница между начальной точкой двух элементовПозиция
( 5) Числовая c разница между конечной позицией двух элементов
, где возвращается первая разница, которая не ноль:
const arr = [
{ chromosome: '2', startPosition: '980000', endPosition: '989000' },
{ chromosome: '2', startPosition: '978000', endPosition: '979000' },
{ chromosome: '1', startPosition: '978000', endPosition: '979000' },
{ chromosome: '10', startPosition: '978000', endPosition: '979000' },
{ chromosome: 'x', startPosition: '978000', endPosition: '979000' },
{ chromosome: 'x', startPosition: '5', endPosition: '979000' },
{ chromosome: '1', startPosition: '978000', endPosition: '9999999' },
];
arr.sort((a, b) => (
((a.chromosome === 'y') - (b.chromosome === 'y')) ||
((a.chromosome === 'x') - (b.chromosome === 'x')) ||
(a.chromosome - b.chromosome) ||
(a.startPosition - b.startPosition) ||
(a.endPosition - b.endPosition)
));
console.log(arr);
Это сделано очень кратким из-за того, что -
неявно приводит обе стороны к числам.
Другой вариант - создать функцию, которая, учитывая один объект, может придумать относительное значение для этого объекта (например, значение каждой разницы хромосом от 0 в 1e20, каждой разницы startPosition от 0 в 1e10 и каждой разницы endPosition от 0 в 1). Затем пропустите оба объекта через эту функцию и проверьте разницу между их относительными значениями:
const arr = [
{ chromosome: '2', startPosition: '980000', endPosition: '989000' },
{ chromosome: '2', startPosition: '978000', endPosition: '979000' },
{ chromosome: '1', startPosition: '978000', endPosition: '979000' },
{ chromosome: '10', startPosition: '978000', endPosition: '979000' },
{ chromosome: 'x', startPosition: '978000', endPosition: '979000' },
{ chromosome: 'x', startPosition: '5', endPosition: '979000' },
{ chromosome: '1', startPosition: '978000', endPosition: '9999999' },
];
const getVal = (obj) => {
const chr = obj.chromosome;
const chromVal = chr === 'y'
? 25
: chr === 'x'
? 24
: Number(chr);
return (
chromVal * 1e20 +
obj.startPosition * 1e10 +
Number(obj.endPosition)
);
return totalVal;
};
arr.sort((a, b) => getVal(a) - getVal(b));
console.log(arr);