Gente, estou figurativamente chocado! Claro que todas as respostas são um pouco antigas, mas ninguém sequer mencionou a estabilidade na classificação! Então, fique comigo, vou tentar o meu melhor para responder à pergunta em si e entrar em detalhes aqui. Então, vou pedir desculpas agora, será muito para ler.
Como em 2018, usarei apenas o ES6, os Polyfills estão disponíveis nos documentos MDN, os quais vincularemos na parte especificada.
Responda a pergunta:
Se suas chaves são apenas números, então você pode usar com segurança Object.keys()
juntamente com Array.prototype.reduce()
a devolver o objeto ordenada:
// Only numbers to show it will be sorted.
const testObj = {
'2000': 'Articel1',
'4000': 'Articel2',
'1000': 'Articel3',
'3000': 'Articel4',
};
// I'll explain what reduces does after the answer.
console.log(Object.keys(testObj).reduce((accumulator, currentValue) => {
accumulator[currentValue] = testObj[currentValue];
return accumulator;
}, {}));
/**
* expected output:
* {
* '1000': 'Articel3',
* '2000': 'Articel1',
* '3000': 'Articel4',
* '4000': 'Articel2'
* }
*/
// if needed here is the one liner:
console.log(Object.keys(testObj).reduce((a, c) => (a[c] = testObj[c], a), {}));
No entanto, se você estiver trabalhando com strings, recomendo encadear Array.prototype.sort()
tudo isso:
// String example
const testObj = {
'a1d78eg8fdg387fg38': 'Articel1',
'z12989dh89h31d9h39': 'Articel2',
'f1203391dhj32189h2': 'Articel3',
'b10939hd83f9032003': 'Articel4',
};
// Chained sort into all of this.
console.log(Object.keys(testObj).sort().reduce((accumulator, currentValue) => {
accumulator[currentValue] = testObj[currentValue];
return accumulator;
}, {}));
/**
* expected output:
* {
* a1d78eg8fdg387fg38: 'Articel1',
* b10939hd83f9032003: 'Articel4',
* f1203391dhj32189h2: 'Articel3',
* z12989dh89h31d9h39: 'Articel2'
* }
*/
// again the one liner:
console.log(Object.keys(testObj).sort().reduce((a, c) => (a[c] = testObj[c], a), {}));
Se alguém está se perguntando o que reduz:
// Will return Keys of object as an array (sorted if only numbers or single strings like a,b,c).
Object.keys(testObj)
// Chaining reduce to the returned array from Object.keys().
// Array.prototype.reduce() takes one callback
// (and another param look at the last line) and passes 4 arguments to it:
// accumulator, currentValue, currentIndex and array
.reduce((accumulator, currentValue) => {
// setting the accumulator (sorted new object) with the actual property from old (unsorted) object.
accumulator[currentValue] = testObj[currentValue];
// returning the newly sorted object for the next element in array.
return accumulator;
// the empty object {} ist the initial value for Array.prototype.reduce().
}, {});
Se necessário, aqui está a explicação para o liner:
Object.keys(testObj).reduce(
// Arrow function as callback parameter.
(a, c) =>
// parenthesis return! so we can safe the return and write only (..., a);
(a[c] = testObj[c], a)
// initial value for reduce.
,{}
);
Por que a classificação é um pouco complicada:
Em resumo Object.keys()
, retornará uma matriz com a mesma ordem que obtemos com um loop normal:
const object1 = {
a: 'somestring',
b: 42,
c: false
};
console.log(Object.keys(object1));
// expected output: Array ["a", "b", "c"]
Object.keys () retorna uma matriz cujos elementos são cadeias correspondentes às propriedades enumeráveis encontradas diretamente no objeto. A ordem das propriedades é a mesma que a especificada repetindo as propriedades do objeto manualmente.
Sidenote - você também pode usar Object.keys()
matrizes, lembre-se de que o índice será retornado:
// simple array
const arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']
Mas não é tão fácil como mostrado nesses exemplos: objetos do mundo real podem conter números e caracteres alfabéticos ou até símbolos (por favor, não faça isso).
Aqui está um exemplo com todos eles em um objeto:
// This is just to show what happens, please don't use symbols in keys.
const testObj = {
'1asc': '4444',
1000: 'a',
b: '1231',
'#01010101010': 'asd',
2: 'c'
};
console.log(Object.keys(testObj));
// output: [ '2', '1000', '1asc', 'b', '#01010101010' ]
Agora, se usarmos Array.prototype.sort()
na matriz acima, a saída será alterada:
console.log(Object.keys(testObj).sort());
// output: [ '#01010101010', '1000', '1asc', '2', 'b' ]
Aqui está uma citação dos documentos:
O método sort () classifica os elementos de uma matriz no local e retorna a matriz. O tipo não é necessariamente estável. A ordem de classificação padrão é de acordo com os pontos de código Unicode da sequência.
A complexidade de tempo e espaço da classificação não pode ser garantida, pois depende da implementação.
Você precisa garantir que um deles retorne a saída desejada para você. Nos exemplos da vida real, as pessoas tendem a misturar as coisas especialmente se você usar diferentes entradas de informações, como APIs e bancos de dados.
Então, qual é o grande problema?
Bem, existem dois artigos que todo programador deve entender:
Algoritmo no local :
Na ciência da computação, um algoritmo no local é um algoritmo que transforma a entrada usando nenhuma estrutura de dados auxiliar. No entanto, uma pequena quantidade de espaço de armazenamento extra é permitida para variáveis auxiliares. A entrada geralmente é substituída pela saída à medida que o algoritmo é executado. O algoritmo in-loco atualiza a sequência de entrada apenas através da substituição ou troca de elementos. Um algoritmo que não está no local é chamado às vezes não no local ou fora do local.
Então, basicamente, nossa matriz antiga será substituída! Isso é importante se você deseja manter a matriz antiga por outros motivos. Portanto, mantenha isso em mente.
Algoritmo de classificação
Os algoritmos de classificação estável classificam elementos idênticos na mesma ordem em que aparecem na entrada. Ao classificar alguns tipos de dados, apenas parte dos dados é examinada ao determinar a ordem de classificação. Por exemplo, no exemplo de classificação de cartas à direita, as cartas estão sendo classificadas por sua classificação e seu naipe é ignorado. Isso permite a possibilidade de várias versões diferentes e ordenadas corretamente da lista original. Os algoritmos de classificação estável escolhem um destes, de acordo com a regra a seguir: se dois itens forem comparados como iguais, como os dois 5 cartões, sua ordem relativa será preservada, de modo que, se um veio antes do outro na entrada, ele também será vem antes do outro na saída.
Um exemplo de classificação estável em cartas de baralho. Quando as cartas são classificadas por classificação com uma classificação estável, os dois 5s devem permanecer na mesma ordem na saída classificada em que estavam originalmente. Quando são classificadas com uma classificação não estável, os 5s podem terminar no oposto ordem na saída classificada.
Isso mostra que a classificação está correta, mas mudou. Portanto, no mundo real, mesmo que a classificação esteja correta, temos que garantir o que esperamos! Isso é super importante, lembre-se disso também. Para obter mais exemplos de JavaScript, consulte Array.prototype.sort () - docs: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort