AntonMs,
var obj = { b:{"param1" : 11, "param2": 22, "param3" : 33}, a:{"param1" : 1, "param2": 2, "param3" : 3}, c:{"param1" : 111, "param2": 222, "param3" : 333} }; function fn(obj, name) { return Object.keys(obj).sort((a,b)=> obj[a][name] - obj[b][name] ) } alert(fn(obj, "param2")); |
var a = { a: { param1: 1, param2: 22, param3: 3 }, b: { param1: 11, param2: 2, param3: 33 }, c: { param1: 111, param2: 222, param3: 333 } }; // ключи оригинального объекта alert(Object.entries(a).map(([key]) => key).join(" > ")); // создадим отсортированный объект var aSorted = Object.entries(a) .sort(([, a], [, b]) => a.param2 > b.param2 ? 1 : -1) .reduce((m, [k, v]) => ({ ...m, [k]: v }), {}) // ключи отсортированного объекта alert(Object.entries(aSorted).map(([key]) => key).join(" > ")); Ключи объекта не должны быть строками, которые могут быть приведены к целочисленному индексу (ecma-international.org/ecma-262/9.0/) Цитата:
var a = { b: { param1: 11, param2: 2, param3: 33 }, a: { param1: 1, param2: 22, param3: 3 }, c: { param1: 111, param2: 222, param3: 333 } }; for(const [key, value] of Object.entries(a)) { alert(key); } |
Цитата:
|
Цитата:
|
Malleys, спасибо, буду разбираться.
|
рони, я понял, объекты это чисто для хранения информации, там нет учета индексов.
|
Цитата:
Цитата:
Посмотрев определение, например, Object.entries, в спецификации (пункт 19.1.2.5), вы увидите, что для получения списка ключей/значении используется внутренний метод EnumerableOwnPropertyNames, в определении которого (пункт 7.3.21) видно, что на объекте вызывается внутренний метод [[OwnPropertyKeys]], в определении которого(9.1.11 и 9.1.11.1) видно, в каком порядке строится список ключей. Сначала добавляются ключи, чьи строковые представления могут быть приведены к целочисленному значению, в возрастающем порядке их численных значении. Затем добавляются ключи, чьи строковые представления не могут быть приведены к целочисленному значению, в порядке их создания. Затем добавляются ключи типа Symbol, в порядке их создания. Хотя в целом, вы не можете получить ключи в порядке создания, но договорившись, что ключи будут только строками не приводимыми к целочисленному значению(я уже это писал выше в №12), вы всё-таки получите ключи в порядке создания! Если вам нужен только вызов внутреннего [[OwnPropertyKeys]], то используйте Reflect.ownKeys alert(Reflect.ownKeys({ b: 1, a: 2, c: 3 }).join(" > ")) |
Malleys, ваш пример работает, но к сожалению я его не понимаю, и к тому же у моего объекта цифры в именах вместо примера с "a, b, c"? И кстати я эти заклинания вообще не понимаю "m, [k, v]) => ({ ...m, [k]: v }), {}", а это "[, b]" вообще работать не должно вроде :cray: Это магия или я нуб!
|
Цитата:
Цитата:
https://learn.javascript.ru/destructuring https://learn.javascript.ru/es-function https://learn.javascript.ru/es-object Или может всё-таки заменить объект на массив пар? Т. е. вместо { b: {}, a: {}, c: {}} у вас будет [["b", {}], ["a", {}], ["c", {}]]. Этот массив пар вы можете передать конструктору Map. new Map([["b", {}], ["a", {}], ["c", {}]]) Перебор осуществляется в порядке вставки. Объекты типа Map гарантируют это, в отличие от объектов типа Object. Это тоже не магия, читайте в учебнике Ильи Кантора https://learn.javascript.ru/set-map |
Цитата:
Цитата:
По поводу "магии" то меня сбили с толку конструкции деструктуризации, не сталкивался с ними раньше, спасибо за ссылку. |
Часовой пояс GMT +3, время: 23:03. |