Как я могу отсортировать объект в JavaScript на основе значения? - PullRequest
0 голосов
/ 13 октября 2011

Мой объект:

[ '4e95b308d36f429729000021': 1,
  '4e95b309d36f429729000039': 2,
  '4e95b308d36f429729000001': 1 ]

Я хочу отсортировать так, чтобы значение 2 было первым.Я знаю, что этот вопрос задавался миллион раз, но это не работает:

var descSort;
descSort = function(a, b) {
  return b.value - a.value;
};
popularLocationsArray.sort(descSort);

Ответы [ 3 ]

3 голосов
/ 13 октября 2011

Прежде всего, ваш код не является допустимым JavaScript, он должен быть:

var popularLocationsArray = [ 
  {'4e95b308d36f429729000021': 1},
  {'4e95b309d36f429729000039': 2},
  {'4e95b308d36f429729000001': 1} 
]

Зная, что ваша проблема в том, что вы не знаете имя ключа в каждом объекте и хотите отсортировать по значению этого ключа. Сначала вам нужно определить вспомогательную функцию:

function anyVal(obj) {
  for(var key in obj) {
    if(obj.hasOwnProperty(key)) {
      return obj[key]
    }
  }
}

Теперь сортировка проста:

popularLocationsArray.sort(function(a,b) {return anyVal(a) - anyVal(b)});
0 голосов
/ 13 октября 2011

Просто чтобы сделать жизнь интереснее, вы можете сделать объекты в массиве сортируемыми (то есть внутри содержащего массива), создав собственный пользовательский объект:

function Foo(key, value) {
  this[key] = value;
}
Foo.prototype.toString = function() {
  for (var p in this) {
    if (this.hasOwnProperty(p)) {
      return this[p];
    }
  }
}
var a = new Foo('4e95b308d36f429729000021', 1);
var b = new Foo('4e95b309d36f429729000039', 2);
var c = new Foo('4e95b308d36f429729000001', 1);
var popularLocationsArray = [a, b, c];

alert(popularLocationsArray); // 1, 2, 1

alert(popularLocationsArray.sort()); //1, 1, 2

Или вы можете отсортировать его по имени ключа или объединить ключ и свойство, что угодно. Просто попросите метод toString вернуть все, что вы хотите, чтобы они были отсортированы.

0 голосов
/ 13 октября 2011

Вы не можете отсортировать объект.У объекта нет причин возвращать свой ключ в каком-либо определенном порядке.

Теперь, если вы имели в виду нечто подобное, у вас есть опции:

function descSort(a, b) {
   var value1 = +a[Object.keys(a)[0]],
       value2 = +b[Object.keys(b)[0]];
   return value2 - value1;
}

[ {'4e95b308d36f429729000021': 1},
  {'4e95b309d36f429729000039': 2},
  {'4e95b308d36f429729000001': 1} ].sort(descSort)

Это использует Object.keys , который не имеет родной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...