У меня есть следующий объект, который я бы хотел отсортировать:
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]
Что отлично, но сейчас индекса нет. Может ли кто-нибудь сказать мне, как это сделать, я часами царапаю голову, пытаясь понять это.
Создайте массив объектов, таким образом вы можете сохранить индекс и значение вместе:
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; });
Объекты не сортируются. При доступе к свойствам объекта вам не гарантируется какой-либо конкретный порядок. Вот почему ваши результаты преобразуются в массивы, которые сортируются. Вот возможное решение
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];
});
Я думаю, вы немного сбиты с толку от вашего консольного вывода. Объекты представляют собой неупорядоченные коллекции свойств. Когда консоль отображает объект, он должен показывать их в некотором порядке, и обычно этот порядок вероятен
Ни в одном из этих случаев никакая сортировка свойств объекта не изменяет базовый идеал объекта, и ваша консоль по-прежнему может отображать ее по желанию.
Поэтому я просто не думаю, что вы можете последовательно добиваться того, что вы ищете. И я не думаю, что это действительно имеет основополагающий смысл.
Если вы хотите, чтобы ваш результат был массивом, тогда мы можем поговорить...