it-swarm.com.ru

Сортировка объекта JavaScript по имени свойства

Я давно искал и хочу найти способ сортировки объекта Javascript, например:

{
    method: 'artist.getInfo',
    artist: 'Green Day',
    format: 'json',
    api_key: 'fa3af76b9396d0091c9c41ebe3c63716'
}

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

{
    api_key: 'fa3af76b9396d0091c9c41ebe3c63716',
    artist: 'Green Day',
    format: 'json',
    method: 'artist.getInfo'
}

Я не могу найти код, который будет делать это. Кто-нибудь может мне помочь?

52
matto1990

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

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

function sortObject(o) {
    var sorted = {},
    key, a = [];

    for (key in o) {
        if (o.hasOwnProperty(key)) {
            a.Push(key);
        }
    }

    a.sort();

    for (key = 0; key < a.length; key++) {
        sorted[a[key]] = o[a[key]];
    }
    return sorted;
}
84
Chris Nielsen

эта функция принимает объект и возвращает отсортированный массив массивов в форме [ключ, значение]

function (o) {
   var a = [],i;
   for(i in o){ 
     if(o.hasOwnProperty(i)){
         a.Push([i,o[i]]);
     }
   }
   a.sort(function(a,b){ return a[0]>b[0]?1:-1; })
   return a;
}

Структура данных объекта не имеет четко определенного порядка. С математической точки зрения, набор ключей в объекте является неупорядоченным набором и должен рассматриваться как таковой Если вы хотите определить порядок, вы ДОЛЖНЫ использовать массив, поскольку массив, имеющий порядок, является предположением, которое вы можете полагаться на. Объект, имеющий какой-то порядок, - это то, что остается на усмотрение реализации.

12
Breton

Просто используйте отсортированный stringify () , когда вам нужно сравнить или хэшировать результаты.

5
exebook
// if ya need old browser support
Object.keys = Object.keys || function(o) {  
var result = [];  
for(var name in o) {  
    if (o.hasOwnProperty(name))  
      result.Push(name);  
}  
    return result;  
};

var o = {c: 3, a: 1, b: 2};
var n = sortem(o);

function sortem(old){
  var newo = {}; Object.keys(old).sort().forEach(function(k) {new[k]=old[k]});
  return newo;
}

// deep
function sortem(old){
  var newo = {}; Object.keys(old).sort().forEach(function(k){ newo[k]=sortem(old[k]) });
  return newo;
}
sortem({b:{b:1,a:2},a:{b:1,a:2}})
3
John Williams

Это следует использовать с осторожностью, так как ваш код не должен полагаться на порядок свойств объекта. Если это просто вопрос презентации (или просто для удовольствия!), Вы можете отсортировать свойства так:

function sortObject(src) {
  var out;
  if (typeof src === 'object' && Object.keys(src).length > 0) {
    out = {};
    Object.keys(src).sort().forEach(function (key) {
      out[key] = sortObject(src[key]);
    });
    return out;
  }
  return src;
}
0
Pierre Maoui