Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 05.02.2019, 23:25
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

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"));
Ответить с цитированием
  #12 (permalink)  
Старый 06.02.2019, 02:05
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

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/)

Сообщение от AntonMs
На данный момент задача именно такая. Вот к примеру объект, если его перебирать то сначала будет "а". А нужно что-бы b > a > c.
В том примере вы ничего не перебираете!

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);
}
Ответить с цитированием
  #13 (permalink)  
Старый 07.02.2019, 00:07
Аватар для AntonMs
Профессор
Отправить личное сообщение для AntonMs Посмотреть профиль Найти все сообщения от AntonMs
 
Регистрация: 25.01.2015
Сообщений: 163

Цитата:
это массив и массив можно отсортировать
Я так сейчас и делаю, и это понятно, я же пришел с другой задачей сюда...
Ответить с цитированием
  #14 (permalink)  
Старый 07.02.2019, 00:20
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

Сообщение от AntonMs
я же пришел с другой задачей сюда...
обьект не сортируют, можно создать новый с необходимой структурой(смотри пост #12), но это бесполезно, браузер не обязан учитывать порядок ключей.
Ответить с цитированием
  #15 (permalink)  
Старый 07.02.2019, 00:22
Аватар для AntonMs
Профессор
Отправить личное сообщение для AntonMs Посмотреть профиль Найти все сообщения от AntonMs
 
Регистрация: 25.01.2015
Сообщений: 163

Malleys, спасибо, буду разбираться.
Ответить с цитированием
  #16 (permalink)  
Старый 07.02.2019, 00:49
Аватар для AntonMs
Профессор
Отправить личное сообщение для AntonMs Посмотреть профиль Найти все сообщения от AntonMs
 
Регистрация: 25.01.2015
Сообщений: 163

рони, я понял, объекты это чисто для хранения информации, там нет учета индексов.
Ответить с цитированием
  #17 (permalink)  
Старый 07.02.2019, 05:06
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от AntonMs
объекты это чисто для хранения информации, там нет учета индексов.
Сообщение от рони
браузер не обязан учитывать порядок ключей
Ключи вы можете получить при помощи метода Object.keys или Object.entries

Посмотрев определение, например, 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(" > "))
Ответить с цитированием
  #18 (permalink)  
Старый 08.02.2019, 22:14
Аватар для AntonMs
Профессор
Отправить личное сообщение для AntonMs Посмотреть профиль Найти все сообщения от AntonMs
 
Регистрация: 25.01.2015
Сообщений: 163

Malleys, ваш пример работает, но к сожалению я его не понимаю, и к тому же у моего объекта цифры в именах вместо примера с "a, b, c"? И кстати я эти заклинания вообще не понимаю "m, [k, v]) => ({ ...m, [k]: v }), {}", а это "[, b]" вообще работать не должно вроде Это магия или я нуб!
Ответить с цитированием
  #19 (permalink)  
Старый 09.02.2019, 12:03
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от AntonMs
к тому же у моего объекта цифры в именах
Если у вас ключи не представляют натуральные числа, составленные только из "0123456789", то вы можете использовать то, что описано мной выше. Также можно те цифры заменить на другие, типа "④⑥" , "❹❻", "𝟓𝟔", "𝟡𝟜", "𝟥𝟩", "𝟮𝟳" или "𝟸𝟼"

Сообщение от AntonMs
я эти заклинания вообще не понимаю... Это магия...
Вы можете прочитать об этом, например, в учебнике Ильи Кантора на русском языке...
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
Ответить с цитированием
  #20 (permalink)  
Старый 09.02.2019, 13:16
Аватар для AntonMs
Профессор
Отправить личное сообщение для AntonMs Посмотреть профиль Найти все сообщения от AntonMs
 
Регистрация: 25.01.2015
Сообщений: 163

Цитата:
можно те цифры заменить на другие
Цитата:
Или может всё-таки заменить объект на массив пар?
Дело в том что желательно построить алгоритм так чтобы тот объект не менять. Есть объект > далее из него генерится столбчатая диаграмма по порядку, но нужно что-бы была возможность по "param2" или "param3" по выбору.

По поводу "магии" то меня сбили с толку конструкции деструктуризации, не сталкивался с ними раньше, спасибо за ссылку.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Полностью удалить объект 1lider Events/DOM/Window 8 07.06.2018 18:20
помогите отсортировать объект? san40511 Javascript под браузер 3 25.08.2015 11:08
Помогите определить массив или объект ksnovich Общие вопросы Javascript 1 09.03.2015 17:12
Объект ajax и приостановка функции kilohertz_. AJAX и COMET 5 18.01.2015 16:33
Получить объект содержащий caller no_alex Общие вопросы Javascript 14 20.03.2009 21:37