Отримання першого індексу об’єкта


201

Поміркуйте:

var object = {
  foo: {},
  bar: {},
  baz: {}
}

Як би я це зробив:

var first = object[0];
console.log(first);

Очевидно, що це не працює, тому що перший індекс названий foo, а не 0.

console.log(object['foo']);

працює, але я не знаю, що його називають foo. Це можна назвати чим завгодно. Я просто хочу перше.

Відповіді:


61

Якщо порядок об'єктів є значним, вам слід переглянути свою схему JSON для зберігання об'єктів у масиві:

[
    {"name":"foo", ...},
    {"name":"bar", ...},
    {"name":"baz", ...}
]

або можливо:

[
    ["foo", {}],
    ["bar", {}],
    ["baz", {}]
]

Як зазначає Бен Альперт, властивості об’єктів Javascript не упорядковані, і ваш код порушений, якщо ви очікуєте, що вони будуть перераховані в тому ж порядку, який вони вказані в об'єктному буквальному значенні - немає "першого" властивості.


6
Я ніколи не бачив (я в obj) робити речі в іншому порядку, ти кажеш, що іноді для (я в obj) виганяю речі в іншому порядку?
Райан Флоренція

4
Не виключено, що так і буде. У специфікаціях йдеться про те, що її не потрібно перераховувати в певному порядку. Це в значній мірі означає, що цей порядок може змінитися.
PatrikAkerstrand

5
Більшість браузерів сьогодні зберігають порядок вставки, але це не завжди було так; специфікація цього не вимагає. Існували останні версії Chrome, які не зберегли порядок вставки.
Майлз

1
Коли я заглиблювався в те, що я робив, порядок речей став важливішим (я думав, що я дбаю лише про перше, але я помилявся!), Тож було зрозуміло зберігати мої об’єкти в масиві, як ви запропонували.
Райан Флоренція

1
Якщо ви знаєте, що в об'єкта є лише один елемент, то ви знаєте порядок.
Данртон

329

Просто для розваги це працює в JS 1.8.5

var obj = {a: 1, b: 2, c: 3};
Object.keys(obj)[0]; // "a"

Це збігається з тим самим порядком, який ви бачили б робити

for (o in obj) { ... }

24
Очистити найкращий варіант, якщо не потрібна сумісність беквалінгу кам'яного віку.
Даг Сондре Хансен

1
100% найкраща відповідь. Це найпростіший і найшвидший спосіб зробити це.
Справа

3
Просто для уточнення, згідно з en.wikipedia.org/wiki/JavaScript#Version_history JS 1.8.5 не підтримується до IE9. На жаль, багато людей ще в кам'яному віці.
Норемак

Чудовий. Короткий і простий. Дякуємо @Jacob
Сарібан Д'Кл

якщо хтось використовує IE9, я відчуваю його біль. спасибі це дивовижно
CMS

204

Якщо ви хочете чогось стислого, спробуйте:

for (first in obj) break;

alert(first);

завершено як функція:

function first(obj) {
    for (var a in obj) return a;
}

8
Дивіться відповідь Люка Шафера нижче, він використовує метод hasOwnProperty для того, щоб не захопити членів прототипу.
Командир коду

3
Щоб один лайнер працював у всіх веб-переглядачах, включаючи IE8 і нижче, for (var key in obj) if (obj.hasOwnProperty(key)) break;тоді ви хочете використовувати keyзмінну
Ally

не працює, якщо перший елемент є типом об'єкта. повертається 0
сніг

Object.keys(obj)[0];набагато швидше (0,072 мс), ніж for(1,664 мс).
Себастьян Ортманн

77

вони насправді не замовлені, але ви можете:

var first;
for (var i in obj) {
    if (obj.hasOwnProperty(i) && typeof(i) !== 'function') {
        first = obj[i];
        break;
    }
}

.hasOwnProperty()важливо ігнорувати об'єкти прототипів.


У наведеному вище коді є помилка. Перевірка typeof має бути typeof (i)
jacob.toye

@Napalm він мав на увазі помилку в імені змінної, що перевіряється, а не синтаксис. Ви маєте рацію, але багатьом людям подобається думка щодо читабельності
Люк Шафер

Дякую. Це дивовижно.
Сантош

76

Це не дасть вам першого, оскільки об’єкти javascript не мають упорядкованості, однак це добре в деяких випадках.

myObject[Object.keys(myObject)[0]]

39

для першого ключа об'єкта, який ви можете використовувати

console.log(Object.keys(object)[0]);//print key's name

за цінністю

console.log(object[Object.keys(object)[0]]);//print key's value

18

Неможливо отримати перший елемент, бачачи, як "хеші" (об'єкти) в JavaScript мають не упорядковані властивості. Ваша найкраща ставка - зберігати ключі в масиві:

var keys = ["foo", "bar", "baz"];

Потім використовуйте це, щоб отримати належне значення:

object[keys[0]]

16

ES6

const [first] = Object.keys(obj)

Це працює, але чи можете ви пояснити, як це працює? Тільки показ коду не дозволяє мені зрозуміти це.
Даан

1
Це завдання руйнування . По суті, він присвоює першому елементу повернутого масиву змінну в квадратних дужках.
Річард Айотт

12

Використовуючи підкреслення, ви можете використовувати _.pairs, щоб отримати перший запис об'єкта як пару ключових значень наступним чином:

_.pairs(obj)[0]

Тоді ключ буде доступний з подальшим [0]індексом, значення з[1]


Найкраще працює, коли використовується underscore.js. Просто те, що мені було потрібно ... Дякую, Джордж!
Goldengalaxy

10

У мене була та сама проблема вчора. Я вирішив це так:

var obj = {
        foo:{},
        bar:{},
        baz:{}
    },
   first = null,
   key = null;
for (var key in obj) {
    first = obj[key];
    if(typeof(first) !== 'function') {
        break;
    }
}
// first is the first enumerated property, and key it's corresponding key.

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


1
Привіт @PatrikAkerstrand рано я випадково натиснув на голову. Будь-ласка, внесіть будь-які зміни у вашій програмі, щоб я її скасував. Вибачте.
rogeriolino

7

Ви можете зробити щось подібне:

var object = {
    foo:{a:'first'},
    bar:{},
    baz:{}
}


function getAttributeByIndex(obj, index){
  var i = 0;
  for (var attr in obj){
    if (index === i){
      return obj[attr];
    }
    i++;
  }
  return null;
}


var first = getAttributeByIndex(object, 0); // returns the value of the
                                            // first (0 index) attribute
                                            // of the object ( {a:'first'} )

6

Щоб отримати перший ключ від вашого об’єкта

const myObject = {
   'foo1': { name: 'myNam1' },
   'foo2': { name: 'myNam2' }
}

const result = Object.keys(myObject)[0];

// result will return 'foo1'

Яка різниця у цій відповіді на відповідь Якова?
ЯківЛ

це впевнено дає свіжіше, що цей вид коду працює ідеально.
Сантош

5

На основі відповіді CMS . Я не отримую значення безпосередньо, замість цього беру ключ у його індексі і використовую це, щоб отримати значення:

Object.keyAt = function(obj, index) {
    var i = 0;
    for (var key in obj) {
        if ((index || 0) === i++) return key;
    }
};


var obj = {
    foo: '1st',
    bar: '2nd',
    baz: '3rd'
};

var key = Object.keyAt(obj, 1);
var val = obj[key];

console.log(key); // => 'bar'
console.log(val); // => '2nd'

2

Моє рішення:

Object.prototype.__index = function(index)
{
    var i = -1;
    for (var key in this)
    {
        if (this.hasOwnProperty(key) && typeof(this[key])!=='function')
            ++i;
        if (i >= index)
            return this[key];
    }
    return null;
}
aObj = {'jack':3, 'peter':4, '5':'col', 'kk':function(){alert('hell');}, 'till':'ding'};
alert(aObj.__index(4));

12
приємний, тільки… ваш стиль кодування! якого біса? ці брекети є скрізь!
літаючі вівці

2
Чи знаєте ви стиль пітона? Я щойно додав дужки з вертикальним вирівнюванням у стиль python. У будь-якому випадку, "Пекло - це інші люди", :-D
діаїзм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.