Если у меня есть объект вроде:
{ 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' }
Если я заранее не знаю, что список поднимается до 'c', кроме цикла через объект, есть ли способ получить последний элемент в объекте (например, 'carrot'
)?
Если у меня есть объект вроде:
{ 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' }
Если я заранее не знаю, что список поднимается до 'c', кроме цикла через объект, есть ли способ получить последний элемент в объекте (например, 'carrot'
)?
Нет. Заказ не гарантируется в JSON и большинстве других структур данных с ключевыми значениями, поэтому последний элемент иногда может быть carrot
, а в других случаях - banana
и т.д. Если вам нужно полагаться на заказ, лучше всего пойти с массивами. Сила структур данных ключевого значения заключается в доступе к значениям их keys
, а не в возможности получить элемент nth
объекта.
Да, есть способ использовать 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).length-1] // "carrot"
last = Object.keys(obj)[Object.keys(obj).length-1];
где obj - ваш объект
var myObj = {a: 1, b: 2, c: 3}, lastProperty;
for (lastProperty in myObj);
lastProperty;
//"c";
источник: http://javascriptweblog.wordpress.com
Решение с использованием синтаксиса назначения деструктуризации ES6:
var temp = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var { [Object.keys(temp).pop()]: lastItem } = temp;
console.info(lastItem); //"carrot"
Используйте массив, а не литерал объекта, если порядок имеет значение.
list = ['apple', 'banana', 'carrot'];
Или что-то вроде
dict = {
'a' : ['apple', 'awesome'],
'b' : ['best friend']
};
Или даже..
dict = [{letter:'a', list:['apple', 'awesome']},{letter:'b', list:['best friend']}];
Ключи для dict
не гарантируются в порядке.
Что касается упорядочения свойств объекта в Javascript, я просто свяжусь с этим ответом:
Порядок элементов в "for (... in...)" цикл
В частности:
Все современные реализации ECMAScript итерация через объект свойства в том порядке, в котором они были определены
Таким образом, каждый другой ответ здесь верен, нет официального гарантированного порядка для объектных свойств. Однако на практике существует (запрет на любые ошибки, которые, естественно, могут испортить даже официально установленное поведение).
Кроме того, де-факто порядок перечисления свойств объекта, вероятно, будет кодифицирован в будущих спецификациях EMCAScript.
Тем не менее, в это время я не буду писать код вокруг этого, главным образом потому, что нет встроенных инструментов, которые помогут справиться с порядком свойств объекта. Вы можете написать свой собственный, но в конце вы всегда будете перебирать каждое свойство в объекте, чтобы определить его позицию.
Таким образом, ответ на ваш вопрос Нет, нет никакого способа, кроме прокрутки объекта.
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'
Вы также можете использовать метод Object.values()
:
Object.values(fruitObject)[Object.values(fruitObject).length - 1]; // "carrot"
Объект карты в JavaScript , Это уже около трех лет. Эта структура данных карты сохраняет порядок вставки элементов. При этом извлечении последнего элемента на самом деле будет получен последний элемент, вставленный в Map
Пусть obj
- ваш объект. Exec:
(_ => _[Object.keys(_).pop()])( obj )
если вы хотите получить последний ключ в алфавитном порядке, вы можете (гарантировано):
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'