Сортировка массива по 4 размерностям

Полезные скрипты
Ответить
Аватара пользователя
mihas
Администратор
Сообщения: 1419
Зарегистрирован: 18 авг 2004, 16:58
Откуда: Москва
Контактная информация:

Сортировка массива по 4 размерностям

Сообщение mihas »

Некоторое время ломал голову, как бы красиво отсортировать массив по 4 размерностям разом, на помощь пришел мой коллега Федор Одинцов, вот его лаконичный код многомерной сортировки. Кол-во размерностей сортировки исходя из этой идеи можно и нарастить спокойно! Поменять местами a и b в аргументах функции - и сортировка пойдет в обратном порядке. Иными словами круто, в сети подобного не нашел, пусть тут будет:

Код: Выделить всё

function Sort_an_array_by_4_dimensions(first, second, third, forth) {
	return function(a, b) {
		if (a[first] === b[first]) {
			if (a[second] === b[second]){
				if (a[third] === b[third]){
					return a[forth] - b[forth];
				} else {
					return a[third] - b[third];
				}
			} else {
				return a[second] - b[second];
			}
		} else {
			return a[first] - b[first];
		}
	}
}
Образец работы функции на реальном примере массива в 1588 полей по ссылке.
Простой переводчик таблиц Excel в массивы яваскрипт по ссылке.
Смена колонок таблицы на строки таблицы (поворот) по ссылке.
mosurov
Сообщения: 1
Зарегистрирован: 14 авг 2024, 08:14

Сортировка массива по 4 размерностям

Сообщение mosurov »

Доброго времени суток. Я стараюсь писать более гибкий код для того чтобы можно было его как можно больше переиспользовать без изменения. Если вам понадобится более гибкий вариант можете рассмотреть вот такой вариант для чисел(первое что пришло в голову):

Код: Выделить всё

function multiColumnSort(array, columns) {
    return array.sort((a, b) => {
        for (let col of columns) {
            const absCol = Math.abs(col) - 1; // Преобразуем в индекс массива (0-based index)
            const direction = col > 0 ? 1 : -1; // Определяем направление сортировки

            if (a[absCol] < b[absCol]) {
                return -1 * direction;
            } else if (a[absCol] > b[absCol]) {
                return 1 * direction;
            }
        }
        return 0; // Если элементы равны по всем столбцам, возвращаем 0
    });
}
В функцию multiColumnSort передается 2 аргумента:
1. array - многомерный массив,
2. columns - список номеров колонок по которым надо сортировать. Если номер положительный то сортировка по возрастанию, если отрицательный по убыванию.

Пример использования:

Код: Выделить всё

const data = [
    [1, 5, 3],
    [1, 2, 9],
    [1, 5, 7],
    [2, 2, 8]
];

const sortColumns = [1, -3]; // Сначала сортируем по 1 столбцу по возрастанию, затем по 3 столбцу по убыванию

const sortedData = multiColumnSort(data, sortColumns);
console.log(sortedData);
Ответить

Вернуться в «JavaScript»