Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как отсортировать функцией sort многомерный ассоциативный массив? (https://javascript.ru/forum/misc/83667-kak-otsortirovat-funkciejj-sort-mnogomernyjj-associativnyjj-massiv.html)

raja 09.02.2022 11:06

Как отсортировать функцией sort многомерный ассоциативный массив?
 
пример попытки отсортировать многомерный массив по полю full_time:
var array = {
  "2685": {
    "deal_title": "Настроить телефонию",
    "COMPANY_ID": "1709",
    "deadline": "",
    "COMPANY_TITLE": "ГК Оптимум",
    "full_time": " - "
  },
  "3531": {
    "deal_title": "CRG Внедрение Битркис24 + Коробка",
    "COMPANY_ID": "2009",
    "deadline": "",
    "COMPANY_TITLE": "ПРОЕКТНЫЙ ИНСТИТУТ \"ГЕОПЛАН\"",
    "full_time": " - "
  },
  "5037": {
    "deal_title": "Приложение для Битрикс24",
    "COMPANY_ID": "2009",
    "deadline": "",
    "COMPANY_TITLE": "ПРОЕКТНЫЙ ИНСТИТУТ \"ГЕОПЛАН\"",
    "full_time": " - "
  },
  "5575": {
    "deal_title": "Базовое внедрение (54)",
    "COMPANY_ID": "1336",
    "deadline": "",
    "COMPANY_TITLE": "ИП Лебедев Максим Андреевич",
    "full_time": " - "
  },
  "6521": {
    "deal_title": "Доработка Битркис24",
    "COMPANY_ID": "1717",
    "deadline": "",
    "COMPANY_TITLE": "АЛЬФА-ГИФТС  ГРУПП",
    "full_time": " - "
  },
  "6551": {
    "deal_title": "Приложение Стоп-работа",
    "COMPANY_ID": "1362",
    "deadline": "",
    "COMPANY_TITLE": "Роско",
    "full_time": " - "
  },
  "6797": {
    "deal_title": "Экспорт остатков по кассам",
    "COMPANY_ID": "1336",
    "deadline": "",
    "COMPANY_TITLE": "ИП Лебедев Максим Андреевич",
    "full_time": " - "
  },
  "10151": {
    "deal_title": "Сопровождение на 2021 год (7 часов в месяц)",
    "COMPANY_ID": "2569",
    "deadline": "",
    "COMPANY_TITLE": "Российское Газовое Общество",
    "full_time": " - "
  },
  "10263": {
    "deal_title": "Купон на УФ (1 год)",
    "COMPANY_ID": "2587",
    "deadline": "",
    "COMPANY_TITLE": "Компас-Р",
    "full_time": " - "
  },
  "10375": {
    "deal_title": "Прием оплат+доработка интеграции",
    "COMPANY_ID": "2191",
    "deadline": "",
    "COMPANY_TITLE": "Комтех",
    "full_time": " - "
  },
  "10749": {
    "deal_title": "Доработки портала (сентябрь)",
    "COMPANY_ID": "1278",
    "deadline": "",
    "COMPANY_TITLE": "ООО \"ТЕРВУД\"",
    "full_time": " - "
  },
  "10835": {
    "deal_title": "Доработки коробки",
    "COMPANY_ID": "3179",
    "deadline": "",
    "COMPANY_TITLE": "ООО \"Много Мебели\"",
    "full_time": " - "
  },
  "10897": {
    "deal_title": "Сопровождение",
    "COMPANY_ID": "3473",
    "deadline": "",
    "COMPANY_TITLE": "ООО \"УПРАВЛЕНЧЕСКИЕ РЕШЕНИЯ\"",
    "full_time": " - "
  },
  "11017": {
    "deal_title": "Техподдержка Битрикс24 с программированием (40 часов)",
    "COMPANY_ID": "2501",
    "deadline": "2022-05-31T03:00:00+03:00",
    "COMPANY_TITLE": "АО «НИИ «ПОЛЮС» ИМ. М.Ф.СТЕЛЬМАХА»",
    "full_time": " - "
  },
  "11183": {
    "deal_title": "Доработки портала (декабрь)",
    "COMPANY_ID": "1278",
    "deadline": "2022-01-13T03:00:00+03:00",
    "COMPANY_TITLE": "ООО \"ТЕРВУД\"",
    "full_time": " - "
  },
  "11213": {
    "deal_title": "Техподдержка Битрикс24 с 1 по 30 июня 2021 года",
    "COMPANY_ID": "1362",
    "deadline": "2022-01-31T03:00:00+03:00",
    "COMPANY_TITLE": "Роско",
    "full_time": " - "
  },
  "11227": {
    "deal_title": "ВН",
    "COMPANY_ID": "52701",
    "deadline": "2022-01-20T03:00:00+03:00",
    "COMPANY_TITLE": "ООО \"РУССКИЙ ТУР\"",
    "full_time": " - "
  },
  "11235": {
    "deal_title": "Доработка способов оплаты в приложении \"Выбор услуг\"",
    "COMPANY_ID": "2335",
    "deadline": "2022-01-31T03:00:00+03:00",
    "COMPANY_TITLE": "ООО \"МОСУСТАНОВКА\"",
    "full_time": " - "
  },
  "11321": {
    "deal_title": "Разработка ТЗ на приложение для Битрикс24",
    "COMPANY_ID": "55227",
    "deadline": "2022-02-16T03:00:00+03:00",
    "COMPANY_TITLE": "ООО \"АКРИТ-СЕРВИС\"",
    "full_time": " - "
  },
  "11331": {
    "deal_title": "Техподдержка Битрикс24 с 1 по 30 июня 2021 года",
    "COMPANY_ID": "1362",
    "deadline": "2022-02-28T03:00:00+03:00",
    "COMPANY_TITLE": "Роско",
    "full_time": " - "
  },
  "11345": {
    "deal_title": "тест 1",
    "COMPANY_ID": "55233",
    "deadline": "2022-02-10T03:00:00+03:00",
    "COMPANY_TITLE": "Тест Роман",
    "task_id": "29191",
    "task_name": "Получить платёж на сумму 1 руб. по статье \"Не заполнено\"",
    "begin_time": "2022-02-07T12:16:45+03:00",
    "comment": "тест",
    "full_time": 56699208
  },
  "11365": {
    "deal_title": "тест 2",
    "COMPANY_ID": "55235",
    "deadline": "2022-02-07T03:00:00+03:00",
    "COMPANY_TITLE": "тест Роман 2",
    "task_id": "29187",
    "task_name": "Получить платёж на сумму 1 руб. по статье \"Не заполнено\"",
    "begin_time": "2022-02-07T12:16:12+03:00",
    "full_time": -202500792
  },
  "11391": {
    "deal_title": "тестовая сделка 3",
    "COMPANY_ID": "55241",
    "deadline": "2022-02-09T03:00:00+03:00",
    "COMPANY_TITLE": "тест Роман 3",
    "task_id": "29183",
    "task_name": "Получить платёж на сумму 1 руб. по статье \"Не заполнено\"",
    "begin_time": "2022-02-07T12:15:24+03:00",
    "full_time": -29700793
  }
}

function compare(a, b) {
     return a.full_time - b.full_time;
}
array.sort(compare);

console.log('array');
console.log(array);


выводит ошибку: Uncaught TypeError: array.sort is not a function
почему не сортирует и как исправить?

рони 09.02.2022 11:21

raja,
объекты не сортируются, сортируются массивы!!!

raja 09.02.2022 11:24

а как тогда создать ассоциативный многомерный массив вместо объекта?

voraa 09.02.2022 11:41

Потому, что array у Вас не массив, а объект.
Массивы задаются в квадратных скобках []

voraa 09.02.2022 11:42

Цитата:

Сообщение от raja
а как тогда создать ассоциативный

В js нет ассоциативных массивов.

voraa 09.02.2022 11:45

a.full_time - b.full_time;
У вас full_time то строка, то число. Их нельзя вычетать.

ksa 09.02.2022 12:15

Цитата:

Сообщение от voraa
У вас full_time то строка, то число. Их нельзя вычетать.

Само действие возможно. Но результат бывает "интересный"...:D

ksa 09.02.2022 12:19

Цитата:

Сообщение от raja
почему не сортирует и как исправить?

Про "почему" тебе уже написали...
Теперь про "как исправить".

Ты можешь работать с самой последовательностью ключей.
Object.keys()

Вернет тебе сам список ключей и это уже будет массив. ;)
Изменить его и "переставить местами" элементы, опираясь на данные в объекте, уже выполнимая задача.

Этот массив может быть кагбэ индексом (в понимании СУБД) для перебора данных объекта в нужном порядке.

Nexus 10.02.2022 14:07

var array = {
  "2685": {
    "deal_title": "Настроить телефонию",
    "COMPANY_ID": "1709",
    "deadline": "",
    "COMPANY_TITLE": "ГК Оптимум",
    "full_time": " - "
  },
  "3531": {
    "deal_title": "CRG Внедрение Битркис24 + Коробка",
    "COMPANY_ID": "2009",
    "deadline": "",
    "COMPANY_TITLE": "ПРОЕКТНЫЙ ИНСТИТУТ \"ГЕОПЛАН\"",
    "full_time": " - "
  },
  "5037": {
    "deal_title": "Приложение для Битрикс24",
    "COMPANY_ID": "2009",
    "deadline": "",
    "COMPANY_TITLE": "ПРОЕКТНЫЙ ИНСТИТУТ \"ГЕОПЛАН\"",
    "full_time": " - "
  },
  "5575": {
    "deal_title": "Базовое внедрение (54)",
    "COMPANY_ID": "1336",
    "deadline": "",
    "COMPANY_TITLE": "ИП Лебедев Максим Андреевич",
    "full_time": " - "
  },
  "6521": {
    "deal_title": "Доработка Битркис24",
    "COMPANY_ID": "1717",
    "deadline": "",
    "COMPANY_TITLE": "АЛЬФА-ГИФТС  ГРУПП",
    "full_time": " - "
  },
  "6551": {
    "deal_title": "Приложение Стоп-работа",
    "COMPANY_ID": "1362",
    "deadline": "",
    "COMPANY_TITLE": "Роско",
    "full_time": " - "
  },
  "6797": {
    "deal_title": "Экспорт остатков по кассам",
    "COMPANY_ID": "1336",
    "deadline": "",
    "COMPANY_TITLE": "ИП Лебедев Максим Андреевич",
    "full_time": " - "
  },
  "10151": {
    "deal_title": "Сопровождение на 2021 год (7 часов в месяц)",
    "COMPANY_ID": "2569",
    "deadline": "",
    "COMPANY_TITLE": "Российское Газовое Общество",
    "full_time": " - "
  },
  "10263": {
    "deal_title": "Купон на УФ (1 год)",
    "COMPANY_ID": "2587",
    "deadline": "",
    "COMPANY_TITLE": "Компас-Р",
    "full_time": " - "
  },
  "10375": {
    "deal_title": "Прием оплат+доработка интеграции",
    "COMPANY_ID": "2191",
    "deadline": "",
    "COMPANY_TITLE": "Комтех",
    "full_time": " - "
  },
  "10749": {
    "deal_title": "Доработки портала (сентябрь)",
    "COMPANY_ID": "1278",
    "deadline": "",
    "COMPANY_TITLE": "ООО \"ТЕРВУД\"",
    "full_time": " - "
  },
  "10835": {
    "deal_title": "Доработки коробки",
    "COMPANY_ID": "3179",
    "deadline": "",
    "COMPANY_TITLE": "ООО \"Много Мебели\"",
    "full_time": " - "
  },
  "10897": {
    "deal_title": "Сопровождение",
    "COMPANY_ID": "3473",
    "deadline": "",
    "COMPANY_TITLE": "ООО \"УПРАВЛЕНЧЕСКИЕ РЕШЕНИЯ\"",
    "full_time": " - "
  },
  "11017": {
    "deal_title": "Техподдержка Битрикс24 с программированием (40 часов)",
    "COMPANY_ID": "2501",
    "deadline": "2022-05-31T03:00:00+03:00",
    "COMPANY_TITLE": "АО «НИИ «ПОЛЮС» ИМ. М.Ф.СТЕЛЬМАХА»",
    "full_time": " - "
  },
  "11183": {
    "deal_title": "Доработки портала (декабрь)",
    "COMPANY_ID": "1278",
    "deadline": "2022-01-13T03:00:00+03:00",
    "COMPANY_TITLE": "ООО \"ТЕРВУД\"",
    "full_time": " - "
  },
  "11213": {
    "deal_title": "Техподдержка Битрикс24 с 1 по 30 июня 2021 года",
    "COMPANY_ID": "1362",
    "deadline": "2022-01-31T03:00:00+03:00",
    "COMPANY_TITLE": "Роско",
    "full_time": " - "
  },
  "11227": {
    "deal_title": "ВН",
    "COMPANY_ID": "52701",
    "deadline": "2022-01-20T03:00:00+03:00",
    "COMPANY_TITLE": "ООО \"РУССКИЙ ТУР\"",
    "full_time": " - "
  },
  "11235": {
    "deal_title": "Доработка способов оплаты в приложении \"Выбор услуг\"",
    "COMPANY_ID": "2335",
    "deadline": "2022-01-31T03:00:00+03:00",
    "COMPANY_TITLE": "ООО \"МОСУСТАНОВКА\"",
    "full_time": " - "
  },
  "11321": {
    "deal_title": "Разработка ТЗ на приложение для Битрикс24",
    "COMPANY_ID": "55227",
    "deadline": "2022-02-16T03:00:00+03:00",
    "COMPANY_TITLE": "ООО \"АКРИТ-СЕРВИС\"",
    "full_time": " - "
  },
  "11331": {
    "deal_title": "Техподдержка Битрикс24 с 1 по 30 июня 2021 года",
    "COMPANY_ID": "1362",
    "deadline": "2022-02-28T03:00:00+03:00",
    "COMPANY_TITLE": "Роско",
    "full_time": " - "
  },
  "11345": {
    "deal_title": "тест 1",
    "COMPANY_ID": "55233",
    "deadline": "2022-02-10T03:00:00+03:00",
    "COMPANY_TITLE": "Тест Роман",
    "task_id": "29191",
    "task_name": "Получить платёж на сумму 1 руб. по статье \"Не заполнено\"",
    "begin_time": "2022-02-07T12:16:45+03:00",
    "comment": "тест",
    "full_time": 56699208
  },
  "11365": {
    "deal_title": "тест 2",
    "COMPANY_ID": "55235",
    "deadline": "2022-02-07T03:00:00+03:00",
    "COMPANY_TITLE": "тест Роман 2",
    "task_id": "29187",
    "task_name": "Получить платёж на сумму 1 руб. по статье \"Не заполнено\"",
    "begin_time": "2022-02-07T12:16:12+03:00",
    "full_time": -202500792
  },
  "11391": {
    "deal_title": "тестовая сделка 3",
    "COMPANY_ID": "55241",
    "deadline": "2022-02-09T03:00:00+03:00",
    "COMPANY_TITLE": "тест Роман 3",
    "task_id": "29183",
    "task_name": "Получить платёж на сумму 1 руб. по статье \"Не заполнено\"",
    "begin_time": "2022-02-07T12:15:24+03:00",
    "full_time": -29700793
  }
}

var sortedArray = Object.values(array).sort((a, b) => {
    const [first, second] = [a, b].map(({full_time: value}) => {
        if (typeof value === 'string' && value.includes('-')) {
            return 0;
        }
        
        return value;
    });
    
    return first - second;
});

console.log(sortedArray);


Часовой пояс GMT +3, время: 19:19.