получение последнего элемента в объекте javascript

96

Если у меня есть объект вроде:

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

Если я не знаю заранее, что список идет вверх до 'c', кроме цикла по объекту, есть ли способ получить последний элемент в объекте (например 'carrot')?

спругман
источник
Это хороший вопрос. Кроме того, как можно проверить объекты на пустоту, кроме как перебирать их?
Лукас Эдер
2
свойство, а не «предмет». и нет, порядок свойств не определен.
Бесплатная консультация
последнее значение собственности, которое он имеет в виду, я бы сказал
KooiInc

Ответы:

67

Номер заказа не гарантируется в формате JSON и большинства других структур данных ключ-значение, поэтому поэтому последний пункт может быть иногда carrotи в другое время быть bananaи так далее. Если вам нужно полагаться на порядок, лучше всего использовать массивы. Сила структур данных "ключ-значение" заключается в доступе к значениям по ним keys, а не в возможности получить nthэлемент объекта.

Alex
источник
1
В качестве дополнения к этому совершенно правильному ответу. Объекты не являются массивами, даже если вы создаете ассоциативный массив в JS с помощью маркеров массива, []это действительно объект. JS не имеет ассоциативных массивов как таковых, массивы имеют индексированный доступ и последовательность; объекты имеют ассоциативный доступ к свойствам, непоследовательный.
Orbling
3
Я знаю, что у них нет гарантии, что у них будет порядок, но если у меня есть контроль над созданием объекта, с практической точки зрения я могу убедиться, что они находятся в определенном порядке. Ясно, однако, что ответ на вопрос - «нет». :)
sprugman
2
@sprugman: Нет в Chrome. На эту тему бушуют
Tim Down
225

Да, есть способ использовать Object.keys(obj). Это объясняется на этой странице :

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

Если вы хотите получить значение последнего объекта, вы можете сделать это:

fruitObject[Object.keys(fruitObject)[Object.keys(fruitObject).length - 1]] // "carrot"
Кристина Стефанова
источник
8
Этот должен был быть принятым, он Object.keysотлично работает. Просто нужно найти способ заставить его работать в IE8 и 7, потому что это проявилось только в IE9.
RaphaelDDL 02
4
вы можете сделать это напрямую с помощью Object.values ​​(fruitObject), который будет возвращать значения вместо ключей, а затем выполнить pop () для вашего массива, чтобы вернуть последний элемент.
Ивон Хуин
4
Первый ответ здесь - правильный ответ. Я пробовал использовать Object.keysснова и снова, только чтобы обнаружить, что свойства на самом деле были упорядочены случайным образом. Фактический порядок свойств отличается от того, что отображается при входе в консоль вашего браузера. При входе в консоль браузера свойства автоматически переупорядочиваются и отображаются в алфавитном / цифровом порядке, что определенно вызывает некоторую путаницу.
kennsorr
1
Спецификация JS не гарантирует порядок ключей и может варьироваться в зависимости от реализации (движка). Следовательно, невозможно гарантировать порядок вставки для случайно сгенерированного (с ключом) объекта. Массив - это тип объекта, где ключ - это числовой индекс, чтобы гарантировать порядок вставки среди других полезных свойств.
Итан До,
1
Господи, людям было трудно заниматься веб-разработкой еще в 2010-2013 годах ...
Мерк,
22
last = Object.keys(obj)[Object.keys(obj).length-1];

где obj - ваш объект

user3282891
источник
1
Он получает последний ключ ( 'c'в данном случае), но вопрос сформулирован таким образом, что подразумевает, что спрашивающий ищет последнее значение ( 'carrot'). Это также не добавляет ничего, что еще не было охвачено ответом Кристины Стефановой
bmaupin
14
var myObj = {a: 1, b: 2, c: 3}, lastProperty;
for (lastProperty in myObj);
lastProperty;
//"c";

источник: http://javascriptweblog.wordpress.com

Джордж
источник
2
«кроме прохождения через объект»
спругман
3
Те, кому нужно получить первый ключ объекта, могут следовать описанному выше пути, но вот так:for (firstProperty in myObj) { break; };
panosru
10

Решение с использованием синтаксиса деструктурирующего присваивания ES6:

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

оллазарев
источник
6

Вы можете попробовать это. Это сохранит последний элемент. Здесь нужно преобразовать obj в массив. Затем используйте pop()функцию массива , которая вернет последний элемент из преобразованного массива.

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

Шапон Пал
источник
5

Что касается порядка свойств объекта в Javascript, я просто дам ссылку на этот ответ:

Порядок элементов в цикле "for (… in…)"

В частности:

Все современные реализации ECMAScript перебирают свойства объекта в том порядке, в котором они были определены.

Таким образом, любой другой ответ здесь правильный, нет официального гарантированного порядка для свойств объекта. Однако на практике есть (за исключением любых ошибок, которые, естественно, могут испортить даже официально оговоренное поведение).

Более того, фактический порядок перечисления свойств объекта, вероятно, будет кодифицирован в будущих спецификациях EMCAScript.

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

Таким образом, ответ на ваш вопрос: нет , кроме цикла по объекту нет другого пути.

MooGoo
источник
Как вы говорите, я бы определенно не стал полагаться на какой-либо порядок перечисления свойств объекта. Для начала, новые реализации ECMAScript не обязаны следовать этому стандарту де-факто, поэтому код, основанный на определенном порядке, не годится для будущего; кроме того, не все современные браузеры ведут себя одинаково. См. Это обсуждение в системе отслеживания ошибок Chrome: code.google.com/p/v8/issues/detail?id=164 . Наконец, я не ожидал, что спецификация ECMAScript стандартизирует это в ближайшее время.
Tim Down
5

Если порядок имеет значение, используйте массив, а не литерал объекта.

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

Или что-то вроде

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

Или даже..

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

dictНе гарантируется, что ключи для находятся в порядке.

Медер Омуралиев
источник
5

Другие ответы слишком усложняют для меня.

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

let lastKey = Object.keys(animals).pop()
let lastValue = animals[Object.keys(animals).pop()]
где-то где-то
источник
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'
Реха Озенц
источник
1

Вы также можете использовать Object.values()метод:

Object.values(fruitObject)[Object.values(fruitObject).length - 1]; // "carrot"
AshNaz87
источник
0

Объект карты в JavaScript . Этому уже около 3 лет. Эта структура данных карты сохраняет порядок, в котором вставляются элементы. При этом извлечение последнего элемента фактически приведет к тому, что последний элемент будет вставлен на карту.

вата
источник
0

Пусть objбудет твоей целью. Exec:

(_ => _[Object.keys(_).pop()])( obj )
Diogowalterdefreitas
источник
0

если вы имеете в виду получить последний ключ по алфавиту, вы можете (гарантированно):

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'
Рафаэль ПИККОЛО
источник