Сортировка объекта JavaScript по имени свойства - PullRequest
54 голосов
/ 01 сентября 2009

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

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

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

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

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

Ответы [ 5 ]

84 голосов
/ 01 сентября 2009

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

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

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;
}
12 голосов
/ 01 сентября 2009

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

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;
}

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

5 голосов
/ 29 октября 2015

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

3 голосов
/ 04 августа 2013
// 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}})
0 голосов
/ 04 мая 2018

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

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...