Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   сортировка значений в объекте (https://javascript.ru/forum/misc/72279-sortirovka-znachenijj-v-obekte.html)

Cache 19.01.2018 09:34

сортировка значений в объекте
 
Здравствуйте.
Есть объект, содержащий n-ное количество идентичных по структуре объектов
Требуется получить отсортированный массив или объект в зависимости от одного из значений внутренних значений
например
obj={
	123={
		v1:5,
		v2:4,
		v3:0,
		id:123
	},
	456={
		v1:0,
		v2:3,
		v3:5,
		id:456
	},
	321={
		v1:2,
		v2:0,
		v3:7,
		id:321
	}
}

как получить отсортированный результат к примеру по убыванию параметра v2
сейчас вместо внешнего объекта использую массив и функцию sort в которую с помощью функции передаю значение того или иного ключа внутреннего объекта, но это не удобно т.к. найти нужный объект по его id невозможно, ибо ключи цифрового массива не содержат нужного идентификатора

ksa 19.01.2018 09:38

Цитата:

Сообщение от Cache
Требуется получить отсортированный массив или объект

Сортировать можно только массивы. У тебя их нет... :no:

рони 19.01.2018 09:45

Cache,
содержимое обьектов не отсортировать, можно только массив, и проблем с этим нет, и где двоеточие?
Цитата:

Сообщение от Cache
сейчас вместо внешнего объекта использую массив и функцию sort в

это правильно, в чём проблема не понял.

Cache 19.01.2018 09:53

Цитата:

Сообщение от рони (Сообщение 475699)
где двоеточие?

исправил
Цитата:

Сообщение от рони (Сообщение 475699)
это правильно, в чём проблема не понял.

проблема в том, что придется перегонять из объекта в массив для сортировки

Cache 19.01.2018 09:57

сейчас это выглядит так:
arr=[
	0={
		v1:5,
		v2:4,
		v3:0,
		id:123
	},
	1={
		v1:0,
		v2:3,
		v3:5,
		id:456
	},
	2={
		v1:2,
		v2:0,
		v3:7,
		id:321
	}
]

т.е. обратиться к внутреннему объекту по его id невозможно на прямую, только получить из внутренней структуры

Cache 19.01.2018 10:00

ksa,
сортировать нужно не сам объект, а получить к примеру 20 подъобъектов с максимальным (относительно всех подобъектов) значением v2, отсортированных в порядке убывания и не равных 0

ksa 19.01.2018 10:00

Цитата:

Сообщение от Cache
проблема в том, что придется перегонять из объекта в массив для сортировки

Не обязательно дублировать информацию. Достаточно сделать кагбэ индекс, если применить терминологию БД, вот его и сортировать.
Элементами массива будут ссылки на нужные экземпляры основного объекта...

ksa 19.01.2018 10:01

Цитата:

Сообщение от Cache
сейчас это выглядит так:

Это синтаксически не верная запись. :no:

Aetae 19.01.2018 10:02

Цитата:

Сообщение от Cache (Сообщение 475703)
проблема в том, что придется перегонять из объекта в массив для сортировки

Значит придётся. В старых браузерах поядок значений в объекте не гарантирован вообще - т.е. как повезёт. В браузерах по-новей, что использовали первую версию нового стандарта - порядок значений выстраивается по мере их добавления в объект. В современных браузерах, использующих последнюю версию стандарта - в объекте идут сначала отсортированные по порядку числовые ключи, потом остальные по очерёдности добавления(имхо, контринтуитивная ересь). И не факт что снова что-то не поменяется.

ksa 19.01.2018 10:02

Цитата:

Сообщение от Cache
получить к примеру 20 подъобъектов с максимальным значением v2

Т.е. "сортировка" не является собственно задачей? Задача совсем в другом.

Тогда напиши что "дано" и что, таки нужно получить в итоге.

Cache 19.01.2018 11:35

Цитата:

Сообщение от ksa (Сообщение 475710)
Т.е. "сортировка" не является собственно задачей? Задача совсем в другом.

Тогда напиши что "дано" и что, таки нужно получить в итоге.

задача, хранить все подобъекты в основном объекте а не в массиве
при этом иметь возможность получить какое-то количество (заданное как константа), например 20, подобъектов с условием что определенное значение у них, например параметр v2, больше чем у остальных (т.е. теоретически это сортировка по убыванию по параметру v2 и взятие первых 20 объектов (по сути нужен их id))

Cache 19.01.2018 11:40

Цитата:

Сообщение от Aetae (Сообщение 475709)
Значит придётся..

возможно что сортировка не единственное решение, потому и пришел на форум, ибо не хватает знаний, как еще, кроме сортировки, можно определить/найти объекты со значением выше чем у остальных (например, 20 подобъектов значение v2 у которых будет больше нежели у остальных подобъектов)

рони 19.01.2018 11:46

Cache,
сделайте ваш обьект для примера, ключей на 10

Aetae 19.01.2018 11:49

Цитата:

Сообщение от Cache (Сообщение 475713)
например 20, подобъектов с условием что определенное значение у них, например параметр v2, больше чем у остальных (т.е. теоретически это сортировка по убыванию по параметру v2 и взятие первых 20 объектов (по сути нужен их id))

arr=[
    {
        v1:5,
        v2:4,
        v3:0,
        id:123
    },{
        v1:0,
        v2:3,
        v3:5,
        id:456
    },{
        v1:2,
        v2:0,
        v3:7,
        id:321
    } //, ...
];

var result = arr.sort(function(a, b){
   return b.v2 - a.v2
}).slice(0, 20)

рони 19.01.2018 12:06

Aetae, :)
.map(function(a) {
    return a.id;
  })

Cache 19.01.2018 12:23

Aetae,
у меня уже есть такая функция для массива, я же говорю про объект, когда изначально будет объект а не массив, можно ли получить такие данные

Cache 19.01.2018 12:28

только у меня она несколько сложнее, с учетом того что сортировка нужна не только по v2 но и по v1 и по v3 и т.д.

Cache 19.01.2018 12:29

Цитата:

Сообщение от рони (Сообщение 475717)
Aetae, :)
.map(function(a) {
    return a.id;
  })

map на сколько помню, опять же работает только с массивами

т.е. в любом случае, на сколько я понял, преобразовывать в массив? поиск по объекту с такими условиями не возможен?

рони 19.01.2018 12:31

Цитата:

Сообщение от Cache
можно ли получить такие данные

да, вы зачем кота за хвост тяните.
Цитата:

Сообщение от ksa
Тогда напиши что "дано" и что, таки нужно получить в итоге.


рони 19.01.2018 12:34

Цитата:

Сообщение от Cache
поиск по объекту с такими условиями не возможен?

а зачем, если можно решить через массив?

Cache 19.01.2018 12:39

Цитата:

Сообщение от рони (Сообщение 475715)
Cache,
сделайте ваш обьект для примера, ключей на 10

во пример, массива, который используется сейчас:
arr=[{"id":31061,"v1":21,"v2":3,"v3":25,"v4":337,"v5":70,"v6":0,"v7":0,"v8":0,"v9":8,"v10":17,"v11":70,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":4659,"v1":14,"v2":2,"v3":397,"v4":473,"v5":58,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":58,"v13":0,"v14":0,"v15":0,"v16":0},{"id":34501,"v1":12,"v2":2,"v3":122,"v4":401,"v5":54,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":30,"v12":24,"v13":0,"v14":0,"v15":0,"v16":0},{"id":33700,"v1":23,"v2":3,"v3":31,"v4":332,"v5":52,"v6":0,"v7":0,"v8":0,"v9":0,"v10":45,"v11":27,"v12":24,"v13":10,"v14":0,"v15":0,"v16":0},{"id":33465,"v1":11,"v2":2,"v3":340,"v4":416,"v5":47,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":47,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":35485,"v1":10,"v2":2,"v3":97,"v4":516,"v5":47,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":37,"v12":10,"v13":0,"v14":0,"v15":0,"v16":0},{"id":4420,"v1":22,"v2":3,"v3":25,"v4":319,"v5":45,"v6":3.75,"v7":18,"v8":0,"v9":10,"v10":0,"v11":45,"v12":0,"v13":0,"v14":15,"v15":0,"v16":0},{"id":2624,"v1":20,"v2":3,"v3":25,"v4":304,"v5":44,"v6":0,"v7":0,"v8":0,"v9":0,"v10":6,"v11":21,"v12":23,"v13":0,"v14":0,"v15":0,"v16":0},{"id":3888,"v1":10,"v2":2,"v3":370,"v4":446,"v5":41,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":41,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":31505,"v1":8,"v2":2,"v3":103,"v4":516,"v5":41,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":16,"v12":25,"v13":0,"v14":0,"v15":0,"v16":0},{"id":9148,"v1":27,"v2":3,"v3":99,"v4":286,"v5":39.3,"v6":3.75,"v7":0,"v8":0,"v9":0,"v10":0,"v11":15,"v12":18,"v13":63,"v14":15,"v15":0,"v16":0},{"id":8814,"v1":13,"v2":2,"v3":77,"v4":461,"v5":38.2,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":36,"v13":22,"v14":0,"v15":0,"v16":0},{"id":9863,"v1":7,"v2":2,"v3":111,"v4":461,"v5":36,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":31,"v12":5,"v13":0,"v14":0,"v15":0,"v16":0},{"id":11403,"v1":8,"v2":2,"v3":39,"v4":374,"v5":36,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":36,"v13":0,"v14":0,"v15":0,"v16":0},{"id":33283,"v1":11,"v2":2,"v3":8,"v4":434,"v5":32.2,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":30,"v13":22,"v14":0,"v15":0,"v16":0},{"id":2654,"v1":23,"v2":3,"v3":58,"v4":281,"v5":31,"v6":16.5,"v7":0,"v8":0,"v9":0,"v10":12,"v11":12,"v12":15,"v13":40,"v14":0,"v15":33,"v16":0},{"id":5697,"v1":11,"v2":2,"v3":35,"v4":445,"v5":30,"v6":0,"v7":0,"v8":0,"v9":18,"v10":0,"v11":30,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":10291,"v1":8,"v2":2,"v3":89,"v4":507,"v5":30,"v6":5,"v7":0,"v8":0,"v9":0,"v10":0,"v11":30,"v12":0,"v13":0,"v14":0,"v15":10,"v16":0},{"id":36762,"v1":10,"v2":2,"v3":191,"v4":539,"v5":30,"v6":12,"v7":0,"v8":0,"v9":0,"v10":0,"v11":30,"v12":0,"v13":0,"v14":0,"v15":0,"v16":12},{"id":2205,"v1":13,"v2":2,"v3":172,"v4":375,"v5":27.6,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":24,"v13":36,"v14":0,"v15":0,"v16":0},{"id":2521,"v1":11,"v2":2,"v3":173,"v4":437,"v5":27.4,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":25,"v13":24,"v14":0,"v15":0,"v16":0},{"id":6023,"v1":12,"v2":2,"v3":120,"v4":355,"v5":27,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":24,"v12":0,"v13":30,"v14":0,"v15":0,"v16":0},{"id":31237,"v1":10,"v2":2,"v3":167,"v4":387,"v5":25,"v6":20,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":25,"v13":0,"v14":0,"v15":0,"v16":20},{"id":32598,"v1":10,"v2":2,"v3":70,"v4":366,"v5":25,"v6":5.5,"v7":0,"v8":0,"v9":0,"v10":0,"v11":25,"v12":0,"v13":0,"v14":22,"v15":0,"v16":0},{"id":37239,"v1":7,"v2":2,"v3":198,"v4":471,"v5":25,"v6":2.5,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":25,"v13":0,"v14":10,"v15":0,"v16":0},{"id":9003,"v1":10,"v2":2,"v3":143,"v4":390,"v5":24,"v6":0,"v7":20,"v8":0,"v9":0,"v10":0,"v11":24,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":37116,"v1":13,"v2":2,"v3":120,"v4":408,"v5":24,"v6":0,"v7":0,"v8":0,"v9":30,"v10":0,"v11":24,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":4939,"v1":13,"v2":2,"v3":79,"v4":354,"v5":22,"v6":0,"v7":0,"v8":0,"v9":0,"v10":36,"v11":22,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":9838,"v1":11,"v2":2,"v3":37,"v4":509,"v5":22,"v6":30,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":22,"v13":0,"v14":0,"v15":0,"v16":30},{"id":30922,"v1":8,"v2":2,"v3":177,"v4":518,"v5":22,"v6":0,"v7":20,"v8":0,"v9":0,"v10":0,"v11":12,"v12":10,"v13":0,"v14":0,"v15":0,"v16":0},{"id":35830,"v1":11,"v2":2,"v3":222,"v4":461,"v5":22,"v6":0,"v7":0,"v8":25,"v9":0,"v10":0,"v11":0,"v12":22,"v13":0,"v14":0,"v15":0,"v16":0},{"id":35852,"v1":4,"v2":1,"v3":65,"v4":651,"v5":18,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":18,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":36298,"v1":4,"v2":1,"v3":127,"v4":700,"v5":18,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":18,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":36578,"v1":4,"v2":1,"v3":87,"v4":506,"v5":18,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":18,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":36697,"v1":4,"v2":1,"v3":405,"v4":660,"v5":18,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":18,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":7970,"v1":9,"v2":2,"v3":36,"v4":462,"v5":18,"v6":0,"v7":0,"v8":25,"v9":0,"v10":0,"v11":6,"v12":12,"v13":0,"v14":0,"v15":0,"v16":0}}]


сорри, спойлера не нашел

Cache 19.01.2018 12:40

Цитата:

Сообщение от рони (Сообщение 475723)
а зачем, если можно решить через массив?

чтобы можно было обратиться к объекту по его id
например так:
obj[id]

Aetae 19.01.2018 12:43

arr=[{"id":31061,"v1":21,"v2":3,"v3":25,"v4":337,"v5":70,"v6":0,"v7":0,"v8":0,"v9":8,"v10":17,"v11":70,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":4659,"v1":14,"v2":2,"v3":397,"v4":473,"v5":58,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":58,"v13":0,"v14":0,"v15":0,"v16":0},{"id":34501,"v1":12,"v2":2,"v3":122,"v4":401,"v5":54,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":30,"v12":24,"v13":0,"v14":0,"v15":0,"v16":0},{"id":33700,"v1":23,"v2":3,"v3":31,"v4":332,"v5":52,"v6":0,"v7":0,"v8":0,"v9":0,"v10":45,"v11":27,"v12":24,"v13":10,"v14":0,"v15":0,"v16":0},{"id":33465,"v1":11,"v2":2,"v3":340,"v4":416,"v5":47,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":47,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":35485,"v1":10,"v2":2,"v3":97,"v4":516,"v5":47,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":37,"v12":10,"v13":0,"v14":0,"v15":0,"v16":0},{"id":4420,"v1":22,"v2":3,"v3":25,"v4":319,"v5":45,"v6":3.75,"v7":18,"v8":0,"v9":10,"v10":0,"v11":45,"v12":0,"v13":0,"v14":15,"v15":0,"v16":0},{"id":2624,"v1":20,"v2":3,"v3":25,"v4":304,"v5":44,"v6":0,"v7":0,"v8":0,"v9":0,"v10":6,"v11":21,"v12":23,"v13":0,"v14":0,"v15":0,"v16":0},{"id":3888,"v1":10,"v2":2,"v3":370,"v4":446,"v5":41,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":41,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":31505,"v1":8,"v2":2,"v3":103,"v4":516,"v5":41,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":16,"v12":25,"v13":0,"v14":0,"v15":0,"v16":0},{"id":9148,"v1":27,"v2":3,"v3":99,"v4":286,"v5":39.3,"v6":3.75,"v7":0,"v8":0,"v9":0,"v10":0,"v11":15,"v12":18,"v13":63,"v14":15,"v15":0,"v16":0},{"id":8814,"v1":13,"v2":2,"v3":77,"v4":461,"v5":38.2,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":36,"v13":22,"v14":0,"v15":0,"v16":0},{"id":9863,"v1":7,"v2":2,"v3":111,"v4":461,"v5":36,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":31,"v12":5,"v13":0,"v14":0,"v15":0,"v16":0},{"id":11403,"v1":8,"v2":2,"v3":39,"v4":374,"v5":36,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":36,"v13":0,"v14":0,"v15":0,"v16":0},{"id":33283,"v1":11,"v2":2,"v3":8,"v4":434,"v5":32.2,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":30,"v13":22,"v14":0,"v15":0,"v16":0},{"id":2654,"v1":23,"v2":3,"v3":58,"v4":281,"v5":31,"v6":16.5,"v7":0,"v8":0,"v9":0,"v10":12,"v11":12,"v12":15,"v13":40,"v14":0,"v15":33,"v16":0},{"id":5697,"v1":11,"v2":2,"v3":35,"v4":445,"v5":30,"v6":0,"v7":0,"v8":0,"v9":18,"v10":0,"v11":30,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":10291,"v1":8,"v2":2,"v3":89,"v4":507,"v5":30,"v6":5,"v7":0,"v8":0,"v9":0,"v10":0,"v11":30,"v12":0,"v13":0,"v14":0,"v15":10,"v16":0},{"id":36762,"v1":10,"v2":2,"v3":191,"v4":539,"v5":30,"v6":12,"v7":0,"v8":0,"v9":0,"v10":0,"v11":30,"v12":0,"v13":0,"v14":0,"v15":0,"v16":12},{"id":2205,"v1":13,"v2":2,"v3":172,"v4":375,"v5":27.6,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":24,"v13":36,"v14":0,"v15":0,"v16":0},{"id":2521,"v1":11,"v2":2,"v3":173,"v4":437,"v5":27.4,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":25,"v13":24,"v14":0,"v15":0,"v16":0},{"id":6023,"v1":12,"v2":2,"v3":120,"v4":355,"v5":27,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":24,"v12":0,"v13":30,"v14":0,"v15":0,"v16":0},{"id":31237,"v1":10,"v2":2,"v3":167,"v4":387,"v5":25,"v6":20,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":25,"v13":0,"v14":0,"v15":0,"v16":20},{"id":32598,"v1":10,"v2":2,"v3":70,"v4":366,"v5":25,"v6":5.5,"v7":0,"v8":0,"v9":0,"v10":0,"v11":25,"v12":0,"v13":0,"v14":22,"v15":0,"v16":0},{"id":37239,"v1":7,"v2":2,"v3":198,"v4":471,"v5":25,"v6":2.5,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":25,"v13":0,"v14":10,"v15":0,"v16":0},{"id":9003,"v1":10,"v2":2,"v3":143,"v4":390,"v5":24,"v6":0,"v7":20,"v8":0,"v9":0,"v10":0,"v11":24,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":37116,"v1":13,"v2":2,"v3":120,"v4":408,"v5":24,"v6":0,"v7":0,"v8":0,"v9":30,"v10":0,"v11":24,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":4939,"v1":13,"v2":2,"v3":79,"v4":354,"v5":22,"v6":0,"v7":0,"v8":0,"v9":0,"v10":36,"v11":22,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":9838,"v1":11,"v2":2,"v3":37,"v4":509,"v5":22,"v6":30,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":22,"v13":0,"v14":0,"v15":0,"v16":30},{"id":30922,"v1":8,"v2":2,"v3":177,"v4":518,"v5":22,"v6":0,"v7":20,"v8":0,"v9":0,"v10":0,"v11":12,"v12":10,"v13":0,"v14":0,"v15":0,"v16":0},{"id":35830,"v1":11,"v2":2,"v3":222,"v4":461,"v5":22,"v6":0,"v7":0,"v8":25,"v9":0,"v10":0,"v11":0,"v12":22,"v13":0,"v14":0,"v15":0,"v16":0},{"id":35852,"v1":4,"v2":1,"v3":65,"v4":651,"v5":18,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":18,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":36298,"v1":4,"v2":1,"v3":127,"v4":700,"v5":18,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":18,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":36578,"v1":4,"v2":1,"v3":87,"v4":506,"v5":18,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":18,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":36697,"v1":4,"v2":1,"v3":405,"v4":660,"v5":18,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":18,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},{"id":7970,"v1":9,"v2":2,"v3":36,"v4":462,"v5":18,"v6":0,"v7":0,"v8":25,"v9":0,"v10":0,"v11":6,"v12":12,"v13":0,"v14":0,"v15":0,"v16":0}];

var result = arr
.sort(function(a, b){
   return b.v2 - a.v2
}) //сортируем по убыванию v2 
.slice(0, 20) //отрезаем верхние 20
.reduce(function(a, b) {
   return a[b.id] = b, a;
}, {}); //набиваем новый объект, где ключами - id

alert(JSON.stringify(result,0,'\t'));
Как видно, независимо от добавления порядок ключей в новом объекте отсортирован по возрастанию и с этим ничего не сделать ибо стандарт. Так что либо удобное обращение по result[id] либо нужный порядок пр итерации.

Cache 19.01.2018 12:45

Цитата:

Сообщение от рони (Сообщение 475722)
Тогда напиши что "дано" и что, таки нужно получить в итоге

что дано, я написал в первом сообщении, т.е. вот этот мсассив, что процитировал выше (это его малая часть) я хочу переделать в объект
но при этом не иметь геммороя с получением отсортированных данных, не гоняя весь объект через преобразование в массив и потом сортировку

Cache 19.01.2018 12:46

Aetae,
я еще раз повторяю, у меня есть функция сортировки этого массива
мне не надо сортировать ЭТОТ массив, что вы уже второй раз пытаетесь сделать, я хочу преобразовать его в объект (пример в первом посте) но при этом иметь возможность получить из него нужные отсортированные данные

рони 19.01.2018 12:50

я пас ...

Cache 19.01.2018 12:54

Aetae,
вот объект который я хочу иметь в итоге:
obj={
	31061:{"id":31061,"v1":21,"v2":3,"v3":25,"v4":337,"v5":70,"v6":0,"v7":0,"v8":0,"v9":8,"v10":17,"v11":70,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},
	4659:{"id":4659,"v1":14,"v2":2,"v3":397,"v4":473,"v5":58,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":58,"v13":0,"v14":0,"v15":0,"v16":0},
	34501:{"id":34501,"v1":12,"v2":2,"v3":122,"v4":401,"v5":54,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":30,"v12":24,"v13":0,"v14":0,"v15":0,"v16":0},
	33700:{"id":33700,"v1":23,"v2":3,"v3":31,"v4":332,"v5":52,"v6":0,"v7":0,"v8":0,"v9":0,"v10":45,"v11":27,"v12":24,"v13":10,"v14":0,"v15":0,"v16":0},
	33465:{"id":33465,"v1":11,"v2":2,"v3":340,"v4":416,"v5":47,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":47,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},
	35485:{"id":35485,"v1":10,"v2":2,"v3":97,"v4":516,"v5":47,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":37,"v12":10,"v13":0,"v14":0,"v15":0,"v16":0},
	4420:{"id":4420,"v1":22,"v2":3,"v3":25,"v4":319,"v5":45,"v6":3.75,"v7":18,"v8":0,"v9":10,"v10":0,"v11":45,"v12":0,"v13":0,"v14":15,"v15":0,"v16":0},
	2624:{"id":2624,"v1":20,"v2":3,"v3":25,"v4":304,"v5":44,"v6":0,"v7":0,"v8":0,"v9":0,"v10":6,"v11":21,"v12":23,"v13":0,"v14":0,"v15":0,"v16":0},
	3888:{"id":3888,"v1":10,"v2":2,"v3":370,"v4":446,"v5":41,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":41,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},
	31505:{"id":31505,"v1":8,"v2":2,"v3":103,"v4":516,"v5":41,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":16,"v12":25,"v13":0,"v14":0,"v15":0,"v16":0},
	9148:{"id":9148,"v1":27,"v2":3,"v3":99,"v4":286,"v5":39.3,"v6":3.75,"v7":0,"v8":0,"v9":0,"v10":0,"v11":15,"v12":18,"v13":63,"v14":15,"v15":0,"v16":0},
	8814:{"id":8814,"v1":13,"v2":2,"v3":77,"v4":461,"v5":38.2,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":36,"v13":22,"v14":0,"v15":0,"v16":0},
	9863:{"id":9863,"v1":7,"v2":2,"v3":111,"v4":461,"v5":36,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":31,"v12":5,"v13":0,"v14":0,"v15":0,"v16":0},
	11403:{"id":11403,"v1":8,"v2":2,"v3":39,"v4":374,"v5":36,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":36,"v13":0,"v14":0,"v15":0,"v16":0}
}

и из него извлекать отсортированные по определенному ключу данные

Aetae 19.01.2018 12:55

Cache, объект и сортировка несовместимы. Ты не властен над порядком ключей объекта. Так или иначе тебе придётся пердолить объект обратно в массив, сортировать массив, и пердолить результат обратно в объект:
obj={
	31061:{"id":31061,"v1":21,"v2":3,"v3":25,"v4":337,"v5":70,"v6":0,"v7":0,"v8":0,"v9":8,"v10":17,"v11":70,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},
	4659:{"id":4659,"v1":14,"v2":2,"v3":397,"v4":473,"v5":58,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":58,"v13":0,"v14":0,"v15":0,"v16":0},
	34501:{"id":34501,"v1":12,"v2":2,"v3":122,"v4":401,"v5":54,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":30,"v12":24,"v13":0,"v14":0,"v15":0,"v16":0},
	33700:{"id":33700,"v1":23,"v2":3,"v3":31,"v4":332,"v5":52,"v6":0,"v7":0,"v8":0,"v9":0,"v10":45,"v11":27,"v12":24,"v13":10,"v14":0,"v15":0,"v16":0},
	33465:{"id":33465,"v1":11,"v2":2,"v3":340,"v4":416,"v5":47,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":47,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},
	35485:{"id":35485,"v1":10,"v2":2,"v3":97,"v4":516,"v5":47,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":37,"v12":10,"v13":0,"v14":0,"v15":0,"v16":0},
	4420:{"id":4420,"v1":22,"v2":3,"v3":25,"v4":319,"v5":45,"v6":3.75,"v7":18,"v8":0,"v9":10,"v10":0,"v11":45,"v12":0,"v13":0,"v14":15,"v15":0,"v16":0},
	2624:{"id":2624,"v1":20,"v2":3,"v3":25,"v4":304,"v5":44,"v6":0,"v7":0,"v8":0,"v9":0,"v10":6,"v11":21,"v12":23,"v13":0,"v14":0,"v15":0,"v16":0},
	3888:{"id":3888,"v1":10,"v2":2,"v3":370,"v4":446,"v5":41,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":41,"v12":0,"v13":0,"v14":0,"v15":0,"v16":0},
	31505:{"id":31505,"v1":8,"v2":2,"v3":103,"v4":516,"v5":41,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":16,"v12":25,"v13":0,"v14":0,"v15":0,"v16":0},
	9148:{"id":9148,"v1":27,"v2":3,"v3":99,"v4":286,"v5":39.3,"v6":3.75,"v7":0,"v8":0,"v9":0,"v10":0,"v11":15,"v12":18,"v13":63,"v14":15,"v15":0,"v16":0},
	8814:{"id":8814,"v1":13,"v2":2,"v3":77,"v4":461,"v5":38.2,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":36,"v13":22,"v14":0,"v15":0,"v16":0},
	9863:{"id":9863,"v1":7,"v2":2,"v3":111,"v4":461,"v5":36,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":31,"v12":5,"v13":0,"v14":0,"v15":0,"v16":0},
	11403:{"id":11403,"v1":8,"v2":2,"v3":39,"v4":374,"v5":36,"v6":0,"v7":0,"v8":0,"v9":0,"v10":0,"v11":0,"v12":36,"v13":0,"v14":0,"v15":0,"v16":0}
};

var result = Object.values(obj) //получаем массив значений из объекта
.sort(function(a, b){
   return b.v2 - a.v2
}) //сортируем по убыванию v2 
.slice(0, 20) //отрезаем верхние 20
.reduce(function(a, b) {
   return a[b.id] = b, a;
}, {}); //набиваем новый объект, где ключами - id

alert(JSON.stringify(result,0,'\t'));

Cache 19.01.2018 13:07

Цитата:

Сообщение от Aetae (Сообщение 475726)
var result = arr
.sort(function(a, b){
   return b.v2 - a.v2
}) //сортируем по убыванию v2 
.slice(0, 20) //отрезаем верхние 20
.reduce(function(a, b) {
   return a[b.id] = b, a;
}, {}); //набиваем новый объект, где ключами - id

alert(JSON.stringify(result,0,'\t'));
Как видно, независимо от добавления порядок ключей в новом объекте отсортирован по возрастанию и с этим ничего не сделать ибо стандарт. Так что либо удобное обращение по result[id] либо нужный порядок пр итерации.

если я правильно понял, вы предлагаете хранить как массив, в том виде что есть сейчас. так и объект для обращения по ключу?
не оптимально, мне кажется, будет занимать в памяти в 2 раза больше места, при том что вложенных объектов около 300 шт и может быть больше
к тому же .slice(0, 20) в данном случае не даст поместить в туда все данные только часть разве нет?

Aetae 19.01.2018 13:10

20 - это из условия конкретной задачи. По остальному см. выше.

Cache 19.01.2018 13:12

Цитата:

Сообщение от Aetae (Сообщение 475732)
Cache, объект и сортировка несовместимы. Ты не властен над порядком ключей объекта

это понятно, я видимо не корректно объяснил, вопрос подразумевал как реализовать данную конвертацию, так чтобы это было достаточно быстро и малозатратно

Цитата:

Сообщение от Aetae (Сообщение 475732)
var result = Object.values(obj) //получаем массив значений из объекта
.sort(function(a, b){
   return b.v2 - a.v2
}) //сортируем по убыванию v2 
.slice(0, 20) //отрезаем верхние 20
.reduce(function(a, b) {
   return a[b.id] = b, a;
}, {}); //набиваем новый объект, где ключами - id

alert(JSON.stringify(result,0,'\t'));

хм, поиграюсь с данным кодом, спасибо, посмосмотрю на результат что получится

Cache 19.01.2018 13:25

Цитата:

Сообщение от Aetae (Сообщение 475735)
20 - это из условия конкретной задачи. По остальному см. выше.

да понятно что по задаче, я подразумевал в вопросе, что в объект попадет все что содержалось в массиве, а 20 будут отдельным массивом с id отсортированными по определенному параметру


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