2013-12-04 2 views
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] 

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

ответ

1

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

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

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

array.sort(function(x, y){ return x.value - y.value || x.index - y.index; }); 
+0

Отлично!Кажется, ты единственный, кто точно понял, что мне нужно. – Yamaha32088

+0

Итак, вы не хотите сортировать объект, просто чтобы получить другое представление данных, которые можно сортировать? Гораздо проще решить проблему. –

+1

Хотя этот вид стабилен, вы можете рассмотреть вариант [ответ от qw3n] (# 20366814) и отсортировать его с помощью 'return x.value -y.value || x.index - y.index', который также поместил бы индексы в числовом порядке для одного и того же значения. (Это может или не важно для вас, но, похоже, это то, что вы ищете.) –

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]; 
}); 
-1

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

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

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

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

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

Смежные вопросы