Расположить похожие объекты в массиве рядом
Я работаю с большими данными, вот упрощённый пример
[
{ a: '0', b: '1' },
{ a: '0', b: '0' },
{ a: '1', b: '1' },
{ a: '2', b: '0' },
{ a: '0', b: '0' },
{ a: '0', b: '1' },
]
Мне нужно расположить похожие по некоторым свойствам записи рядом, например так (порядок не имеет значения)
[
{ a: '0', b: '1' },
{ a: '0', b: '1' },
{ a: '0', b: '0' },
{ a: '0', b: '0' },
{ a: '1', b: '1' },
{ a: '2', b: '0' },
]
С небольшими данным справляется Array.prototype.sort
:
data.sort(({ a: a1, b: b1 }, { a: a2, b: b2 }) => a1 === a2 && b1 === b2 ? 0 : 1)
Но вот с большими данными (100к+) это вообще не даёт результата (т.е. записи которые должны быть рядом находятся в разным местах массив)
Оригинальная функция сравнения:
function compare<T>(a: T, b: T, compareKeys: (keyof T)[], dateField: keyof T) {
const dateFiledA = a[dateField] as unknown as Date
const dateFiledB = b[dateField] as unknown as Date
return compareKeys
.map((c) => a[c] === b[c])
.concat([
dateFiledA.getFullYear() === dateFiledB.getFullYear() &&
dateFiledA.getMonth() === dateFiledB.getMonth() &&
dateFiledA.getDate() === dateFiledB.getDate(),
])
.every(Boolean) ? 0 : 1
}
Источник: Stack Overflow на русском