obter o último item em um objeto javascript

93

Se eu tiver um objeto como:

{ 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' }

Se eu não souber com antecedência que a lista vai até 'c', além de percorrer o objeto, há uma maneira de obter o último item do objeto (por exemplo 'carrot')?

sprugman
fonte
Esta é uma boa pergunta. Além disso, como os objetos podem ser verificados quanto ao vazio, a não ser por um loop sobre eles?
Lukas Eder
2
propriedade não "item". e não, a ordem de propriedade é indefinida.
Consultoria gratuita
o último valor de propriedade que ele quer dizer, eu diria
KooiInc

Respostas:

65

Não. A ordem não é garantida em JSON e na maioria das outras estruturas de dados de valor-chave, portanto, o último item às vezes pode ser carrot, outras vezes pode ser bananae assim por diante. Se você precisa confiar em pedidos, sua melhor aposta é ir com matrizes. O poder das estruturas de dados de valor-chave reside em acessar os valores por meio deles keys, não em ser capaz de obter o nthitem do objeto.

Alex
fonte
1
Como uma expansão dessa resposta totalmente correta. Objetos não são matrizes, mesmo se você criar uma matriz associativa em JS usando os marcadores de matriz [], é realmente um objeto. JS não possui matrizes associativas como tais, matrizes têm acesso indexado e sequência; os objetos têm acesso de propriedade associativa, não sequencial.
Orbling
3
Eu sei que não há garantia de que eles tenham uma ordem, mas se eu tiver controle sobre a criação do objeto, em termos práticos, posso ter certeza de que eles estão em uma ordem específica. Obviamente, a resposta à pergunta é "não". :)
sprugman
2
@sprugman: Não no Chrome. Um longo debate acalorado tem ocorrido sobre este assunto: code.google.com/p/v8/issues/detail?id=164
Tim Down
216

Sim, existe uma maneira de usar Object.keys(obj). É explicado nesta página :

var fruitObject = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
Object.keys(fruitObject); // this returns all properties in an array ["a", "b", "c"]

Se quiser obter o valor do último objeto, você pode fazer o seguinte:

fruitObject[Object.keys(fruitObject)[Object.keys(fruitObject).length - 1]] // "carrot"
Kristina Stefanova
fonte
8
Este deveria ter sido o aceito, isso Object.keysfunciona muito bem. Só preciso encontrar uma maneira de fazê-lo funcionar no IE8 e 7, porque isso apareceu apenas no IE9.
RaphaelDDL
4
você poderia fazer diretamente com Object.values ​​(fruitObject) que retornará os valores em vez das chaves, e então fazer um pop () em seu array para retornar o último elemento.
Yvon Huynh
4
A primeira resposta aqui é a resposta correta. Tentei usar Object.keysvárias vezes apenas para descobrir que as propriedades foram realmente ordenadas aleatoriamente. A ordem real das propriedades é diferente do que é exibido quando conectado ao console do seu navegador. Quando conectado ao console do navegador, as propriedades são reordenadas automaticamente e exibidas em ordem alfabética / numérica, o que definitivamente causa alguma confusão.
kennsorr
1
A especificação JS não garante a ordem da chave e pode variar entre diferentes implementações (mecanismos). Portanto, não é possível garantir a ordem de inserção para objetos gerados aleatoriamente (chaveados). O Array é um tipo de objeto onde a chave é o índice numérico para garantir a ordem de inserção entre outras propriedades úteis.
Ethan Doh
1
Meu Deus, as pessoas tiveram dificuldade em fazer desenvolvimento web em 2010-2013 ...
Merc,
22
last = Object.keys(obj)[Object.keys(obj).length-1];

onde obj é o seu objeto

user3282891
fonte
1
Isso obtém a última chave ( 'c'neste caso), mas a pergunta é formulada de uma forma que implica que quem fez a pergunta está procurando o último valor ( 'carrot'). Isso também não acrescenta nada que já não tenha sido abordado pela resposta de Kristina Stefanova
bmaupin
13
var myObj = {a: 1, b: 2, c: 3}, lastProperty;
for (lastProperty in myObj);
lastProperty;
//"c";

fonte: http://javascriptweblog.wordpress.com

George
fonte
2
"diferente de looping through the object"
sprugman
2
Para aqueles que precisam obter a primeira chave de um objeto podem seguir o caminho acima, mas com isto:for (firstProperty in myObj) { break; };
panosru
10

Solução usando a sintaxe de atribuição de desestruturação do ES6:

var temp = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var { [Object.keys(temp).pop()]: lastItem } = temp;
console.info(lastItem); //"carrot"

ollazarev
fonte
5

Quanto à ordenação das propriedades dos objetos em Javascript, irei apenas criar um link para esta resposta:

Os elementos são ordenados em um loop "for (... in ...)"

Especificamente:

Todas as implementações modernas do ECMAScript iteram por meio das propriedades do objeto na ordem em que foram definidas

Portanto, todas as outras respostas aqui estão corretas, não há uma ordem oficial garantida para as propriedades do objeto. No entanto, na prática, existe (exceto quaisquer bugs que possam, naturalmente, atrapalhar até mesmo o comportamento especificado oficialmente).

Além disso, a ordem de enumeração de fato das propriedades do objeto provavelmente será codificada em especificações futuras do EMCAScript.

Ainda assim, no momento eu não escreveria código em torno disso, principalmente porque não existem ferramentas integradas para ajudar a lidar com a ordem das propriedades do objeto. Você poderia escrever o seu próprio, mas no final você sempre estaria repetindo cada propriedade em um objeto para determinar sua posição.

Como tal, a resposta à sua pergunta é Não , não há outra maneira além de percorrer um objeto.

MooGoo
fonte
Como você disse, eu definitivamente não confiaria em nenhuma ordem para enumeração de propriedade de objeto. Para começar, as novas implementações do ECMAScript não têm a obrigação de seguir esse padrão de fato, portanto, o código que depende de um pedido específico não é à prova de futuro; além disso, nem todos os navegadores atuais se comportam da mesma forma. Veja esta discussão no rastreador de bug do Chrome: code.google.com/p/v8/issues/detail?id=164 . Finalmente, eu não esperaria que a especificação ECMAScript padronizasse isso tão cedo.
Tim Down
5

Use uma matriz, não um objeto literal, se a ordem for importante.

list = ['apple', 'banana', 'carrot'];

Ou algo como

dict = {
 'a' : ['apple', 'awesome'],
 'b' : ['best friend']
};

Ou mesmo ..

dict = [{letter:'a', list:['apple', 'awesome']},{letter:'b', list:['best friend']}];

Não dicthá garantia de que as chaves estejam em ordem.

Meder Omuraliev
fonte
5

Você pode tentar isso. Isso armazenará o último item. Aqui é necessário converter obj em array. Em seguida, use a pop()função array que retornará o último item do array convertido.

var obj = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var last = Object.keys(obj).pop();
console.log(last);
console.log(obj[last]);

Shapon Pal
fonte
5

As outras respostas complicam demais para mim.

let animals = {
  a: 'dog',
  b: 'cat',
  c: 'bird'
}

let lastKey = Object.keys(animals).pop()
let lastValue = animals[Object.keys(animals).pop()]
algum lugar em algum lugar
fonte
3
JSArray = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };  
document.write(Object.keys(JSArray)[Object.keys(JSArray).length-1]);// writes 'c'   
document.write(JSArray[Object.keys(JSArray)[Object.keys(JSArray).length-1]]); // writes 'carrot'
Reha Ozenc
fonte
1

Você também pode usar o Object.values()método:

Object.values(fruitObject)[Object.values(fruitObject).length - 1]; // "carrot"
AshNaz87
fonte
0

Objeto de mapa em JavaScript . Já tem cerca de 3 anos. Essa estrutura de dados do mapa retém a ordem em que os itens são inseridos. Com esta recuperação do último item irá resultar no último item inserido no Mapa

vatsa
fonte
0

Deixe objser seu objeto. Exec:

(_ => _[Object.keys(_).pop()])( obj )
Diogo PEREIRA MARQUES
fonte
0

se você quer dizer obter a última chave em ordem alfabética, você pode (garantido):

var obj = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var keys = Object.keys(obj);
keys.sort();
var lastkey = keys.pop() // c
var lastvalue = obj[lastkey] // 'carrot'
Raphael PICCOLO
fonte