Якщо у мене є такий об’єкт, як:
{ 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' }
Якщо я заздалегідь не знаю, що список піднімається до 'c', крім перегляду об'єкта, чи є спосіб отримати останній елемент в об'єкті (наприклад 'carrot'
)?
Якщо у мене є такий об’єкт, як:
{ 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' }
Якщо я заздалегідь не знаю, що список піднімається до 'c', крім перегляду об'єкта, чи є спосіб отримати останній елемент в об'єкті (наприклад 'carrot'
)?
Відповіді:
Ні. Порядок не гарантується в JSON та більшості інших структур даних ключ-значення, тому останній елемент іноді може бути, carrot
а в інший час може бути banana
тощо. Якщо вам потрібно покластися на замовлення, найкраще вибрати масиви. Сила структур даних ключ-значення полягає у доступі до значень за їхніми значеннями keys
, а не в можливості отримати nth
елемент об’єкта.
[]
це справді об'єкт. JS не має асоціативних масивів як таких, масиви мають індексований доступ та послідовність; об'єкти мають асоціативний доступ до властивостей, не послідовний.
Так, є спосіб використання 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"
Object.keys
працює надзвичайно. Просто потрібно знайти спосіб змусити його працювати на IE8 та 7, оскільки це з’явилося лише на IE9.
Object.keys
знову і знову лише для того, щоб виявити, що властивості насправді були впорядковані випадковим чином. Фактичний порядок властивостей відрізняється від того, що відображається при вході на консоль браузера. При вході на консоль браузера властивості автоматично впорядковуються та відображаються в алфавітному чи цифровому форматі, що, безумовно, викликає певну плутанину.
last = Object.keys(obj)[Object.keys(obj).length-1];
де obj - це ваш об'єкт
'c'
у цьому випадку), але питання формулюється таким чином, що означає, що запитувач шукає останнє значення ( 'carrot'
). Це також насправді не додає нічого, що вже не висвітлено у відповіді Крістіни Стефанової
Рішення з використанням синтаксису призначення деструктуризації ES6:
var temp = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var { [Object.keys(temp).pop()]: lastItem } = temp;
console.info(lastItem); //"carrot"
Що стосується упорядкування властивостей об’єктів у Javascript, я просто посилаюся на цю відповідь:
Елементи розташовані в циклі "for (… in…)"
Зокрема:
Усі сучасні реалізації ECMAScript перебирають властивості об’єкта в тому порядку, в якому вони були визначені
Отже, будь-яка інша відповідь тут є правильною, офіційного гарантованого наказу щодо заперечення властивостей немає. Однак на практиці це є (заборона будь-яких помилок, які, природно, можуть зіпсувати навіть встановлену офіційно поведінку).
Крім того, фактичний порядок переліку властивостей об’єкта, ймовірно, буде кодифікований у майбутніх специфікаціях EMCAScript.
Тим не менше, наразі я б не писав коду навколо цього, здебільшого тому, що немає вбудованих інструментів, які допомагають мати справу з порядком властивостей об’єкта. Ви можете написати свій власний, але врешті-решт ви завжди переглядаєте кожну властивість об’єкта, щоб визначити його положення.
Таким чином, відповідь на ваше запитання - Ні , не існує іншого шляху, крім перегляду об'єкта.
Якщо порядок має значення, використовуйте масив, а не об’єктний літерал.
list = ['apple', 'banana', 'carrot'];
Або щось подібне
dict = {
'a' : ['apple', 'awesome'],
'b' : ['best friend']
};
Або навіть..
dict = [{letter:'a', list:['apple', 'awesome']},{letter:'b', list:['best friend']}];
Ключі для dict
взагалі не гарантовано в порядку.
Ви можете спробувати це. Тут зберігатиметься останній предмет. Тут потрібно перетворити obj в масив. Потім використовуйте pop()
функцію масиву, яка поверне останній елемент із перетвореного масиву.
var obj = { 'a' : 'apple', 'b' : 'banana', 'c' : 'carrot' };
var last = Object.keys(obj).pop();
console.log(last);
console.log(obj[last]);
Інші відповіді занадто ускладнюють це для мене.
let animals = {
a: 'dog',
b: 'cat',
c: 'bird'
}
let lastKey = Object.keys(animals).pop()
let lastValue = animals[Object.keys(animals).pop()]
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'
Об'єкт карти в JavaScript . Зараз це вже близько 3 років. Ця структура даних карти зберігає порядок вставки елементів. При цьому отримання останнього елемента фактично призведе до останнього елемента, вставленого на карту
Нехай obj
буде вашим об’єктом. Виконання:
(_ => _[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'