отримання останнього елемента в об’єкті javascript


93

Якщо у мене є такий об’єкт, як:

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

Якщо я заздалегідь не знаю, що список піднімається до 'c', крім перегляду об'єкта, чи є спосіб отримати останній елемент в об'єкті (наприклад 'carrot')?


Це гарне запитання. Крім того, як можна перевірити об’єкти на предмет порожнечі, крім циклу над ними?
Лукас Едер,

2
властивість не "предмет". і ні, порядок власності не визначений.
Безкоштовні консультації

останнє значення властивості, яке він має на увазі, я б сказав
KooiInc

Відповіді:


64

Ні. Порядок не гарантується в JSON та більшості інших структур даних ключ-значення, тому останній елемент іноді може бути, carrotа в інший час може бути bananaтощо. Якщо вам потрібно покластися на замовлення, найкраще вибрати масиви. Сила структур даних ключ-значення полягає у доступі до значень за їхніми значеннями keys, а не в можливості отримати nthелемент об’єкта.


1
Як розширення цієї цілком правильної відповіді. Об'єкти не є масивами, навіть якщо ви створюєте асоціативний масив у JS, використовуючи маркери масиву, []це справді об'єкт. JS не має асоціативних масивів як таких, масиви мають індексований доступ та послідовність; об'єкти мають асоціативний доступ до властивостей, не послідовний.
Орблінг

3
Я знаю, що їм не гарантовано замовлення, але якщо я контролюю створення об’єкта, на практиці я можу переконатися, що вони в певному порядку. Очевидно, що відповідь на запитання - "ні". :)
sprugman

2
@sprugman: Не в Chrome. На цю тему тривали
Тім Даун

216

Так, є спосіб використання 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

4
Ви можете зробити безпосередньо з Object.values ​​(fruitObject), який поверне значення замість ключів, а потім зробить спливаючу підказку () для вашого масиву, щоб повернути останній елемент.
Івон Хайн

4
Перша відповідь тут - правильна. Я намагався використовувати Object.keysзнову і знову лише для того, щоб виявити, що властивості насправді були впорядковані випадковим чином. Фактичний порядок властивостей відрізняється від того, що відображається при вході на консоль браузера. При вході на консоль браузера властивості автоматично впорядковуються та відображаються в алфавітному чи цифровому форматі, що, безумовно, викликає певну плутанину.
kennsorr

1
Специфікація JS не гарантує порядок ключів, і він може змінюватися залежно від різних реалізацій (двигунів). Отже, неможливо гарантувати порядок вставки випадково сформованого (ключеного) об’єкта. Масив - це тип Об’єкта, де ключ є числовим індексом, що гарантує порядок вставки серед інших корисних властивостей.
Ітан Дох,

1
Господи, люди важко переживали веб-розробку ще в 2010-2013 роках ...
Мерк,

22
last = Object.keys(obj)[Object.keys(obj).length-1];

де obj - це ваш об'єкт


1
Це отримує останній ключ ( 'c'у цьому випадку), але питання формулюється таким чином, що означає, що запитувач шукає останнє значення ( 'carrot'). Це також насправді не додає нічого, що вже не висвітлено у відповіді Крістіни Стефанової
bmaupin

13
var myObj = {a: 1, b: 2, c: 3}, lastProperty;
for (lastProperty in myObj);
lastProperty;
//"c";

джерело: http://javascriptweblog.wordpress.com


2
"крім циклу через об'єкт"
шпрегмен

2
Для тих, кому потрібно отримати перший ключ від об'єкта, можна слідувати вищезазначеним способом, але з цим: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"


5

Що стосується упорядкування властивостей об’єктів у Javascript, я просто посилаюся на цю відповідь:

Елементи розташовані в циклі "for (… in…)"

Зокрема:

Усі сучасні реалізації ECMAScript перебирають властивості об’єкта в тому порядку, в якому вони були визначені

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

Крім того, фактичний порядок переліку властивостей об’єкта, ймовірно, буде кодифікований у майбутніх специфікаціях EMCAScript.

Тим не менше, наразі я б не писав коду навколо цього, здебільшого тому, що немає вбудованих інструментів, які допомагають мати справу з порядком властивостей об’єкта. Ви можете написати свій власний, але врешті-решт ви завжди переглядаєте кожну властивість об’єкта, щоб визначити його положення.

Таким чином, відповідь на ваше запитання - Ні , не існує іншого шляху, крім перегляду об'єкта.


Як ви кажете, я точно не буду покладатися на будь-який порядок перерахування властивостей об’єкта. Для початку нові реалізації ECMAScript не зобов’язані слідувати цьому де-факто стандарту, тому код, що покладається на певний порядок, не є надійним; також, не всі поточні браузери поводяться однаково. Див. Це обговорення на пристрої відстеження помилок Chrome: code.google.com/p/v8/issues/detail?id=164 . Нарешті, я не очікував би, що специфікація ECMAScript стандартизує це найближчим часом.
Тім Даун

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

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

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


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"

0

Об'єкт карти в JavaScript . Зараз це вже близько 3 років. Ця структура даних карти зберігає порядок вставки елементів. При цьому отримання останнього елемента фактично призведе до останнього елемента, вставленого на карту



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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.