Сортировка значений в индексах хранения объектов

0

У меня есть следующий объект, который я бы хотел отсортировать:

Object {0: 1, 
        1: 2, 
        2: 1, 
        3: 2, 
        5: 2, 
        6: 1, 
        7: 2, 
        8: 1} 

Вот что я хотел бы, чтобы это стало:

Object {0: 1, 
        2: 1, 
        6: 1, 
        8: 1, 
        1: 2, 
        3: 1, 
        5: 2, 
        7: 1} 

Индекс, содержащий самое низкое значение в нем, должен быть первым экземпляром нового объекта, и он должен поддерживать один и тот же индекс и значение. Я попытался использовать myObject.sort() но он не работает с объектами. Я также пробовал перебирать его, чтобы превратить его в массив, который нужно отсортировать, но когда я вызываю сортировку по результирующему массиву, он удаляет индекс.

for(indx in mainObject){
    myNewObject[indx] = [];
    $.each(myNewObject, function(index) {
        myNewObject[indx].push(mainObject[index]);
    });
}

Вышеприведенный код выводит последний массив следующим образом:

0: 1
1: 2
2: 1
3: 2
4: undefined
5: 2
6: 1
7: 2
8: 1

Вызов метода сортировки для этого массива дает следующее:

[1, 1, 1, 1, 2, 2, 2, 2, undefined]

Что отлично, но сейчас индекса нет. Может ли кто-нибудь сказать мне, как это сделать, я часами царапаю голову, пытаясь понять это.

Теги:
arrays
sorting

3 ответа

1
Лучший ответ

Создайте массив объектов, таким образом вы можете сохранить индекс и значение вместе:

array = [];
for(indx in mainObject){
  array.push({ index: indx, value: mainObject[indx] });
}
array.sort(function(x, y){ return x.value - y.value; });

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

array.sort(function(x, y){ return x.value - y.value || x.index - y.index; });
  • 0
    Отлично! Вы, кажется, единственный, кто понял, что именно мне нужно.
  • 0
    То есть вы не хотите сортировать объект, просто чтобы получить другое представление данных, которые можно сортировать? Гораздо проще проблема ... как продемонстрировано.
Показать ещё 2 комментария
0

Объекты не сортируются. При доступе к свойствам объекта вам не гарантируется какой-либо конкретный порядок. Вот почему ваши результаты преобразуются в массивы, которые сортируются. Вот возможное решение

var obj={
  0: 1,
  1: 2,
  2: 1,
  3: 2,
  4: undefined,
  5: 2,
  6: 1,
  7: 2,
  8: 1
} 
var arr=[];
for (var i in obj){
  arr.push([i-0,obj[i]]);
}
arr.sort(function(a,b){
  //use whatever sorting algorithm in here.  I'm not sure exactly how you wanted it sorted

  return a[0]-b[0]||a[1]-b[1];
});
-2

Я думаю, вы немного сбиты с толку от вашего консольного вывода. Объекты представляют собой неупорядоченные коллекции свойств. Когда консоль отображает объект, он должен показывать их в некотором порядке, и обычно этот порядок вероятен

  • порядок добавления свойств
  • в алфавитном порядке по названию свойства
  • численно по имени свойства, если большинство имен - это строки, представляющие маленькие числа

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

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

Если вы хотите, чтобы ваш результат был массивом, тогда мы можем поговорить...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню