0 / 0 / 0
Регистрация: 14.10.2019
Сообщений: 39
1

Сортировка объектов в убывающем порядке

26.11.2019, 19:23. Показов 3069. Ответов 18

У меня есть объекты. Ну или как правильно сказать..объект объектов. НЕ МАССИВ, что важно)))
Javascript
1
2
3
4
5
6
let obj = {
"first":{"id":2, "name":"first"},
"second":{"id":1, "name":"second"},
"third":{"id":3, "name":"third"}
..объектов может быть куча..
}
Как можно упорядочить эти объекты по id (важный момент, что только по id), чтобы на выходе получилось так:
Javascript
1
2
3
4
5
6
{
"second":{"id":1, "name":"second"},
"first":{"id":2, "name":"first"},
"third":{"id":3, "name":"third"}
... ...
}
Буду благодарен!!!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2019, 19:23
Ответы с готовыми решениями:

Расположить слова в строке в убывающем порядке
Добрый день! Задание: Дона строка. Расположить в строке слова по длине в убывающем порядке. ...

Сортировка массива в убывающем порядке по количеству появлений методом подсчета
Добрый день!Мне нужно отсортировать одномерный массив в убывающем порядке по количеству появлений...

Из двух отсортированных в убывающем порядке массивов получить новый массив, отсортированный в том же порядке
Народ помогите мне исправить вот этот код чтоб он правильно работал Program lab_6(Input,Output);...

Из двух отсортированных в убывающем порядке массивов получить новый массив, отсортированный в том же порядке
Народ,помогите пожалуйста, нужно из Из двух отсортированных в убывающем порядке...

18
Эксперт JS
6440 / 3887 / 2005
Регистрация: 14.06.2018
Сообщений: 6,781
26.11.2019, 19:39 2
"Герои меча и магии": объявлена неделя сортировки. Теперь при каждой сортировке +3 к упорядоченности (С)
2
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
26.11.2019, 19:42 3
Цитата Сообщение от Ullbemine Посмотреть сообщение
Как можно упорядочить эти объекты по id
Ullbemine, никак

Добавлено через 1 минуту
Выводить можно по разному, а упорядочить внутри объекта, к сожалению, никак.
0
Эксперт JS
6440 / 3887 / 2005
Регистрация: 14.06.2018
Сообщений: 6,781
26.11.2019, 19:54 4
Лучший ответ Сообщение было отмечено Ullbemine как решение

Решение

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
</head>
 
<body>
    <script>
        let obj = {
            "first": { "id": 2, "name": "first" },
            "second": { "id": 1, "name": "second" },
            "third": { "id": 3, "name": "third" }
        }
        let obj2 = Object.fromEntries(Object.entries(obj).sort((a, b) => a[1].id - b[1].id));
        for (let key in obj2)
            console.log(key);
    </script>
</body>
</html>
Но тут используется недокументированная особенность, что нечисловые свойства сохраняют свой индекс по мере добавления.
И Object.entries() супер-свежий метод, не везде ещё присутствующий.
1
0 / 0 / 0
Регистрация: 14.10.2019
Сообщений: 39
26.11.2019, 19:58  [ТС] 5
БЛАГОДАРЕН!!!
0
0 / 0 / 0
Регистрация: 14.10.2019
Сообщений: 39
27.11.2019, 09:13  [ТС] 6
У меня есть объекты(их количество не ограничено). Ну или как правильно сказать..объект объектов. НЕ МАССИВ, что важно)))
Javascript
1
2
3
4
5
6
let object = {
  smth1: { smth1: { id:"1" , name: "text" }},
  smth2: { smth2: { id:"3", name: "text"  }},
  smth3: { smth3: { id:"2", name: "text"  }}
... ... ...
}
Как можно упорядочить эти объекты по id (важный момент, что только по id), чтобы на выходе получилось так:
Javascript
1
2
3
4
5
6
let object = {
  smth1: { smth1: { id:"1" , name: "text" }},
  smth3: { smth3: { id:"2", name: "text"  }},
  smth2: { smth2: { id:"3", name: "text"  }}
... ... ...
}
Буду благодарен!!!
0
Эксперт JS
2392 / 1706 / 617
Регистрация: 11.07.2016
Сообщений: 3,937
27.11.2019, 09:17 7
Цитата Сообщение от Ullbemine Посмотреть сообщение
Как можно упорядочить эти объекты
Согласно спецификации элементы JS-объектов не упорядочены. То есть при прохождении объекта циклами типа for ... in ... и другими точный порядок элементов как при определении объекта не гарантируется. Следовательно, упорядочить JS-объекты нельзя. Используйте другие сущности. Например, массивы.
1
0 / 0 / 0
Регистрация: 14.10.2019
Сообщений: 39
27.11.2019, 09:45  [ТС] 8
Хорошо, а если вот Так? Каким образом можно сортировать в порядке убывания?

Javascript
1
2
3
4
5
[
  {t1: {id:"1" , name: "text"}},
  {t2: {id:"3" , name: "text"}},
  {t3: {id:"2" , name: "text"}},
  ]
0
Эксперт JS
2392 / 1706 / 617
Регистрация: 11.07.2016
Сообщений: 3,937
27.11.2019, 10:25 9
При такой структуре можно вот так, например:
Javascript
1
2
3
4
5
6
7
8
9
const arr = [
  {t1: {id:"1" , name: "text"}},
  {t2: {id:"3" , name: "text"}},
  {t3: {id:"2" , name: "text"}},
];
 
arr.sort((a, b) => +b[Object.keys(b)[0]].id - +a[Object.keys(a)[0]].id);
 
console.log(arr);
1
0 / 0 / 0
Регистрация: 14.10.2019
Сообщений: 39
27.11.2019, 11:18  [ТС] 10
Ты крут! Спасибо, что помог!
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
27.11.2019, 13:33 11
Ullbemine, amr-now, был не прав, в es6 есть этот момент
Цитата Сообщение от amr-now Посмотреть сообщение
нечисловые свойства сохраняют свой индекс по мере добавления.
1
Эксперт JS
6440 / 3887 / 2005
Регистрация: 14.06.2018
Сообщений: 6,781
27.11.2019, 15:07 12
shvyrevvg, укажите точный источник информации. Мне тоже интересно.

Там очень хитро всё прикручено к порядку for in. Как там, так и везде во всех методах.

ECMA-262, 10th edition, June 2019
ECMAScript® 2019 Language Specification

13.7.5.15EnumerateObjectProperties ( O )
The mechanics and order of enumerating the properties is not specified but must conform to the rules specified below.
Добавлено через 24 минуты
--------
Простейшие полифиллы Object.entries() и Object.fromEntries() для IE9:
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
41
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
    <script>
        var obj = {
            "first": { "id": 2, "name": "first" },
            "second": { "id": 1, "name": "second" },
            "third": { "id": 3, "name": "third" }
        }
 
        if (Object.entries === undefined)
            Object.entries = function (obj) {
                var array = [];
                for (var key in Object.keys(obj)) {
                    array.push([key, obj[key]]);
                }
                return array;
            }
 
        if (Object.fromEntries === undefined)
            Object.fromEntries = function (array) {
                var obj = {};
                for (var i = 0; i < array.length; i++)
                    obj[array[i][0]] = array[i][1];
                return obj;
            }
 
 
        var obj2 = Object.fromEntries(Object.entries(obj).sort(function (a, b) { return a[1].id - b[1].id; }));
        for (var key in obj2) // По возрастанию
            console.log(key);
        console.log("-------");
        var obj3 = Object.fromEntries(Object.entries(obj).sort(function (a, b) { return b[1].id - a[1].id; }));
        for (var key in obj3) // По убыванию
            console.log(key);
    </script>
</body>
</html>
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
27.11.2019, 18:47 13
Лучший ответ Сообщение было отмечено amr-now как решение

Решение

Цитата Сообщение от amr-now Посмотреть сообщение
shvyrevvg, укажите точный источник информации.
amr-now, кажись оно.
1
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
28.11.2019, 05:36 14
В общем, можно получить свойства в порядке их добавления, например, с помощью getOwnPropertyNames(на msdn, похоже, неверная информация), но тот же for-in порядок не гарантирует.
1
Эксперт JS
6440 / 3887 / 2005
Регистрация: 14.06.2018
Сообщений: 6,781
28.11.2019, 08:39 15
shvyrevvg, соединим нашу информацию.
Я не полностью расшифровал свой найденный пункт:
13.7.5.15 EnumerateObjectProperties ( О )
Механика и порядок перечисления свойств не определены, но должны соответствовать правилам, указанным ниже.

Перечислимые имена свойств объектов-прототипов должны быть получены путем вызова EnumerateObjectProperties, передающих объект-прототип в качестве аргумента. EnumerateObjectProperties должен получить собственные ключи свойств целевого объекта, вызвав его внутренний метод [[OwnPropertyKeys]].
То есть я не дочитал в конце, что в одном "вагончике" поезда, представляющего собой весь составной "объект" в понимании классического ООП как совокупность нестатической и статической части,
непосредственно все OwnPropertyKeys перебираются в порядке, изложенном в 9.1.11[[OwnPropertyKeys]] ( )

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

Добавлено через 8 минут
Цитата Сообщение от shvyrevvg Посмотреть сообщение
тот же for-in порядок
Для объекта, составленного из нескольких "вагончиков", обход вагончиков наверно не гарантирован,
но перебор внутри одного вагончика получается гарантирован.
То есть Object.keys() плюс частный случай for in для одного вагончика переберут свойства ожидаемо.

Добавлено через 8 минут
(Естественно, что в процессе перебора мы не добавляли и не удаляли свойства.)

Добавлено через 3 минуты
Прикол в том, что гарантия снимается как раз при добавлении/удалении свойств.

Добавлено через 11 минут
----
В пункте также в алгоритме показывается перебор свойств, возможно созданных конструктором или добавленных позже, но ДО перебора.
Наглядный алгоритм перебора всех перечисляемых свойств из 13.7.5.15 EnumerateObjectProperties
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  function* EnumerateObjectProperties(obj) {
    let visited = new Set;
    for (let key of Reflect.ownKeys(obj)) {
      if (typeof key === "string") {
        let desc = Reflect.getOwnPropertyDescriptor(obj, key);
        if (desc && !visited.has(key)) {
          visited.add(key);
          if (desc.enumerable) yield key;
        }
      }
    }
    let proto = Reflect.getPrototypeOf(obj)
    if (proto === null) return;
    for (let protoName of EnumerateObjectProperties(proto)) {
      if (!visited.has(protoName)) yield protoName;
    }
  }
1
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
28.11.2019, 08:44 16
Цитата Сообщение от amr-now Посмотреть сообщение
но перебор внутри одного вагончика получается гарантирован.
amr-now, по логике да, но
Цитата Сообщение от amr-now Посмотреть сообщение
EnumerateObjectProperties должен получить собственные ключи свойств целевого объекта, вызвав его внутренний метод [[OwnPropertyKeys]].
я так понял, внутри EnumerateObjectProperties получит ключи в том же порядке, но о том в каком порядке будет их перебирать ничего не говорится Не могу найти ссылку, но вот по этой, Allen Wirfs-Brock, вроде как, тоже об этом пишет.
1
Эксперт JS
6440 / 3887 / 2005
Регистрация: 14.06.2018
Сообщений: 6,781
28.11.2019, 08:50 17
shvyrevvg, кстати да. В спецификации решили не гарантировать перечисление собственных свойств целевого объекта для for in.
В алгоритме
The following is an informative definition of an ECMAScript generator function that conforms to these rules
То есть тупо не противоречит вышеприведенным правилам и не более того.
Странно. Здесь играем, здесь не играем, а здесь рыбу заворачиваем.
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
28.11.2019, 08:55 18
Цитата Сообщение от amr-now Посмотреть сообщение
Странно. Здесь играем, здесь не играем, а здесь рыбу заворачиваем.
Угу...

Добавлено через 46 секунд
В общем, нужно использовать структуры по их назначению
1
Эксперт JS
6440 / 3887 / 2005
Регистрация: 14.06.2018
Сообщений: 6,781
28.11.2019, 09:46 19
Лучший ответ Сообщение было отмечено shvyrevvg как решение

Решение

shvyrevvg, всё ответ найден. В пределах одного "вагончика" порядок перечисляемых свойств гарантирован:
19.1.2.17 Object.keys ( O )
When the keys function is called with argument O, the following steps are taken:
Let obj be ? ToObject(O).
Let nameList be ? EnumerableOwnPropertyNames(obj, "key").
Return CreateArrayFromList(nameList).
7.3.21 EnumerableOwnPropertyNames ( O, kind )
When the abstract operation EnumerableOwnPropertyNames is called with Object O and String kind the following steps are taken:
Assert: Type(O) is Object.
Let ownKeys be ? O.[[OwnPropertyKeys]]().
Let properties be a new empty List.
For each element key of ownKeys in List order, do
If Type(key) is String, then
Let desc be ? O.[[GetOwnProperty]](key).
If desc is not undefined and desc.[[Enumerable]] is true, then
If kind is "key", append key to properties.
Else,
Let value be ? Get(O, key).
If kind is "value", append value to properties.
Else,
Assert: kind is "key+value".
Let entry be CreateArrayFromList(« key, value »).
Append entry to properties.
Order the elements of properties so they are in the same relative order as would be produced by the Iterator that would be returned if the EnumerateObjectProperties internal method were invoked with O.
Return properties.
https://www.ecma-international... pertynames
shvyrevvg, суровое ура
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2019, 09:46
Помогаю со студенческими работами здесь

Из двух отсортированных в убывающем порядке массивов получить новый массив, отсортированный в том же порядке
Из двух отсортированных в убывающем порядке массивов получить новый массив, отсортированный в том...

Сортировка объектов через указатели, основанная на алфавитном порядке имен
Нашел в книге пример сортировки объектов, содержащих поле типа string, через указатели. Сортировка...

Выгрузка из стека в убывающем порядке
Поместить в стек константы длины byte: a = 7(16), b = 15(16), c = 5(16). Извлечь их из стека в...

упорядочить массив в убывающем порядке.
Дана функция которая упорядочивает массив в возрастающем порядке. Надо её переделать, чтобы...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru