Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
 Аватар для sergiu920
0 / 0 / 0
Регистрация: 30.04.2012
Сообщений: 28

Сортировка массива с объектами на javascript

06.12.2018, 19:55. Показов 3024. Ответов 4

Студворк — интернет-сервис помощи студентам
Здравствуйте! У меня появилась одна интересная задача. Есть массив объектов. Каждый объект из данного массива представляет из себя описание какой-то ошибки.


Каждый объект имеет такие свойства:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
 
 
var object1 = { 
 
    'fieldName': 'dec_table_row_r74c1', 
 
    'error_code': parseInt('004', 10), 
 
    'msg' : 'Описание ошибки' 
 
}
'fieldName' - это имя текстового поля, которая вызвала данную ошибку. То есть поле которое не было заполнена правильно.

'error_code' - это код ошибки

'msg' - это описание ошибки

Для общего представления: Есть страница с большой формой, каждое поле из этой формы имеет свои правила заполнения.
Если мы заполнили не правильно несколько полей, то перед отправки формы появляется список ошибок.

Пример списка с ошибками:
Строка 31, колонка 2 - код ошибки: 05-014. Описание ошибки: Вы не заполнили правильно поле
Строка 10, колонка 3 - код ошибки: 05-021. Описание ошибки: Вы не заполнили правильно поле
Строка 20, колонка 3 - код ошибки: 05-021. Описание ошибки: Вы не заполнили правильно поле
Строка 30, колонка 3 - код ошибки: 05-021. Описание ошибки: Вы не заполнили правильно поле
Строка 31, колонка 3 - код ошибки: 05-021. Описание ошибки: Вы не заполнили правильно поле
Строка 20, колонка 4 - код ошибки: 05-021. Описание ошибки: Вы не заполнили правильно поле
Строка 30, колонка 4 - код ошибки: 05-021. Описание ошибки: Вы не заполнили правильно поле
Строка 50, колонка 4 - код ошибки: 05-021. Описание ошибки: Вы не заполнили правильно поле
Строка 31, колонка 2 - код ошибки: 05-024. Описание ошибки: Вы не заполнили правильно поле

Суть задачи: Нужно отсортировать эти ошибки по коду ошибки(я это уже сделал), потом нужно отсортировать по строкам и потом по колонкам. Получается что надо отсортировать этот список таким образом:

Строка 31, колонка 2 - код ошибки: 05-014. Описание ошибки: Вы не заполнили правильно поле

Строка 10, колонка 3 - код ошибки: 05-021. Описание ошибки: Вы не заполнили правильно поле
Строка 20, колонка 3 - код ошибки: 05-021. Описание ошибки: Вы не заполнили правильно поле
Строка 20, колонка 4 - код ошибки: 05-021. Описание ошибки: Вы не заполнили правильно поле
Строка 30, колонка 3 - код ошибки: 05-021. Описание ошибки: Вы не заполнили правильно поле
Строка 30, колонка 4 - код ошибки: 05-021. Описание ошибки: Вы не заполнили правильно поле
Строка 31, колонка 3 - код ошибки: 05-021. Описание ошибки: Вы не заполнили правильно поле
Строка 50, колонка 4 - код ошибки: 05-021. Описание ошибки: Вы не заполнили правильно поле

Строка 31, колонка 2 - код ошибки: 05-024. Описание ошибки: Вы не заполнили правильно поле

Я уже отсортировал этот список по коду ошибки, используя функцию sort(), но не знаю как в тоже время отсортировать его по строкам и по колонкам.
Подскажите пожалуйста как можно эту задачу реализовать ?

Вот как я сделал сортировку по коду ошибки:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
      var object1 = { 
 
            'fieldName': 'dec_table_row_r74c1', 
 
            'error_code': parseInt('004', 10), 
 
            'msg' : 'Error a' 
 
        } 
 
        var object2 = { 
 
            'fieldName': 'dec_table_row_r74c2', 
 
            'error_code': parseInt('024', 10), 
 
            'msg' : 'Error b' 
 
        } 
 
        var object3 = { 
 
            'fieldName': 'dec_table_row_r74c3', 
 
            'error_code': parseInt('021', 10), 
 
            'msg' : 'Error c' 
 
        } 
 
        var object4 = { 
 
            'fieldName': 'dec_table_row_r74c4', 
 
            'error_code': parseInt('016', 10), 
 
            'msg' : 'Error d' 
 
        } 
 
        var arr_objects = [object1, object2, object3, object4]; 
 
        arr_objects.sort(function(a, b){ 
 
            return a.error_code - b.error_code; 
 
        });
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.12.2018, 19:55
Ответы с готовыми решениями:

Сортировка массива с объектами класса
#include <iostream> #include <string> using namespace std; class tovary { private: string name; double cina; int kod; ...

UML и javascript, как правильно показать связь между объектами
Изучаю ООП и собственно сам UML Работаю с javascript. Сначала загружается Jquery, инициализируется , получается как глобальный объект....

Сортировка таблицы с объектами
Здравствуйте. Есть таблица вида Table = { = { id = 1 value = 165 name = "В упаковке" }, =

4
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
06.12.2018, 22:34
Здравствуйте!
В sort() надо добавить callback-компаризон.
В структуре массива я не разобрался. Пришлось слепить то, что мне понятно.
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!doctype html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
    <script>
        class Msg {
            constructor(row, column, code) {
                this.row = row;
                this.column = column;
                this.code = code;
            }
            static get(row, column, code){ // Статический фабричный метод
                return new Msg(row, column, code);
            }
        }
        let array = [
            Msg.get(31, 2, "05-014"),
            Msg.get(10, 3, "05-021"),
            Msg.get(31, 3, "05-021"),
            Msg.get(20, 4, "05-021"),
            Msg.get(20, 3, "05-021"),
            Msg.get(30, 3, "05-021"),
            Msg.get(30, 4, "05-021"),
            Msg.get(50, 4, "05-021"),
            Msg.get(31, 2, "05-024")
        ];
        let array2 = array.slice().sort((a, b) =>
            (a.code > b.code || a.code === b.code && a.row > b.row || a.code === b.code && a.row === b.row && a.column > b.column)
                ? 1
                : a.code === b.code && a.row === b.row && a.column === b.column
                    ? 0
                    : -1
        );
        console.log(array);
        console.log(array2);
    </script>
</body>
</html>
0
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
07.12.2018, 01:54
Считаю это неудачный код.

JavaScript
1
2
3
4
5
6
7
let array2 = array.slice().sort((a, b) =>
            (a.code > b.code || a.code === b.code && a.row > b.row || a.code === b.code && a.row === b.row && a.column > b.column)
                ? 1
                : a.code === b.code && a.row === b.row && a.column === b.column
                    ? 0
                    : -1
        );
Допустим b.code больше чем a.code, что очень вероятно, и пока алгоритм это поймет, будут сделаны порядка пяти лишних сравнений. Оптимальней по скорости

JavaScript
1
2
3
4
5
6
7
if(a.code > b.code) return 1;
else if(a.code < b.code) return -1;
else if(a.row > b.row) return 1;
else if(a.row < b.row) return -1;
else if(a.column > b.column) return 1;
else if(a.column < b.column) return -1;
else return 0;
если же скорость неважна, то красивее и проще было бы
JavaScript
1
return a.code - b.code || a.row - b.row || a.column - b.column
1
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
07.12.2018, 10:33
renat_dmitriev, спасибо за напоминание.
Оставлю здесь памятку:
Можно вспомнить, что во многих языках true приводится к 1, а false - к 0.
Воспользуемся этой возможностью. Только одно из условий a<b и b<a истинно, поэтому разность (b<a) - (a<b) замечательно подходит на роль компаратора.
Какие тут плюсы? Помимо невозможности переполнения, такое сравнение можно использовать не только с числами. Например, строки вычитать мы не можем, а сравнивать можем.

Сортировка по нескольким полям
При сравнении по нескольким полям требуется, чтобы следующее поле сравнивалось только когда предыдущие равны. Это значит, что часть компаратора, выполняющая сравнение тех полей при вычислении даёт 0.
Таким образом, для объединения сравнений полей замечательно подходит оператор ||, возвращающий первое истинное (в нашем случае ненулевое) значение, либо самое последнее (в нашем случае 0), если все ложны. Таким способом можно объединить любое количество полей.
Поскольку в данной задаче код ошибки - строка, применим хитрую фичу JS и перепишем вариант №2:
JavaScript
1
2
3
        let array2 = array.slice().sort((a, b) =>
            (b.code < a.code) - (a.code < b.code) || a.row - b.row || a.column - b.column
        );
В си шарпе такое не прокатит.

Прикольно разложены CompareTo() в if:
JavaScript
1
2
3
4
5
6
7
8
9
        let array2 = array.slice().sort((a, b) => {
            if (a.code > b.code) return 1;
            if (a.code < b.code) return -1;
            if (a.row > b.row) return 1;
            if (a.row < b.row) return -1;
            if (a.column > b.column) return 1;
            if (a.column < b.column) return -1;
            return 0
        });
renat_dmitriev, спасибо за напоминания!
1
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
07.12.2018, 11:25
amr-now,

Не по теме:

Посмотрите пожалуйста этот вопрос и ответьте если будет время и желание, мне интересно для собственного развития
Кто как пишет код?

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.12.2018, 11:25
Помогаю со студенческими работами здесь

Вывод и сортировка коллекции с объектами
Подскажите как можно вывести элементы из ArrayList, а затем отсортировать их. В плюсах делал для List так: #include list; ... ...

Сортировка коллекции (collection) с объектами
Привет Для себя я способ нашёл, но с костылями - нужные объекты заворачиваю в класс со всеми вытекающими проблемами и с двумя...

Функции в JavaScript являются объектами первого класса, функциями высшего порядка или и тем и другим одновременно?
читаю пару книг и немного запутался... вопрос следующий: функции в JavaScript являются объектами первого класса, функциями высшего...

Создание массива с объектами
Мне надо создать массив, в который буду записывать объекты(массив будет увеличиваться). как его объявить?

Перебор массива с объектами
Cалам алейкум. Друзья, я довольно хороший нуб в этой сфере и поэтому прошу только о помощи. Возникла такая проблема: Есть массив с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru