Как получить доступ к первому свойству объекта в Javascript? - PullRequest
516 голосов
/ 11 июня 2009

Есть ли элегантный способ доступа к первому свойству объекта ...

  1. где вы не знаете название вашей недвижимости
  2. без использования цикла типа for .. in или jQuery's $.each

Например, мне нужно получить доступ к foo1 объекту, не зная имени foo1:

var example = {
    foo1: { /* stuff1 */},
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};

Ответы [ 16 ]

1215 голосов
/ 16 июля 2012
var obj = { first: 'someVal' };
obj[Object.keys(obj)[0]]; //returns 'someVal'

Используя это, вы можете получить доступ и к другим свойствам по индексам. Будьте внимательны! Object.keys Порядок возврата не гарантируется в соответствии с ECMAScript, однако неофициально он есть во всех основных реализациях браузеров, пожалуйста, прочитайте https://stackoverflow.com/a/23202095 для подробностей об этом.

102 голосов
/ 12 июня 2009

Попробуйте цикл for … in и остановитесь после первой итерации:

for (var prop in object) {
    // object[prop]
    break;
}
44 голосов
/ 16 декабря 2011

Используйте Object.keys, чтобы получить массив свойств объекта. Пример:

var example = {
    foo1: { /* stuff1 */},
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};

var keys = Object.keys(example); // => ["foo1", "foo2", "foo3"] (Note: the order here is not reliable)

Документация и кросс-браузерная прокладка предоставляются здесь . Пример его использования можно найти в другом из моих ответов здесь .

Редактировать : для ясности я просто хочу повторить то, что было правильно указано в других ответах: порядок ключей в объектах javascript не определен.

38 голосов
/ 25 февраля 2017

Вы также можете сделать Object.values(example)[0].

21 голосов
/ 05 июня 2014

Версия с одним правилом:

var val = example[function() { for (var k in example) return k }()];
21 голосов
/ 12 июня 2009

Не существует "первого" свойства. Ключи объектов неупорядочены.

Если вы зациклите их на (var foo in bar), вы получите их в некотором порядке, но это может измениться в будущем (особенно если вы добавите или удалите другие ключи).

9 голосов
/ 11 августа 2017

Решение с lodash библиотекой:

_.find(example) // => {name: "foo1"}

но нет гарантии порядка внутреннего хранения свойств объекта, потому что это зависит от реализации виртуальной машины Java.

9 голосов
/ 12 июня 2009

Нет. Литерал объекта, как определено MDC :

список из нуля или более пар имен свойств и связанных значений объекта, заключенных в фигурные скобки ({}).

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

3 голосов
/ 08 мая 2013

Я не рекомендую вам использовать Object.keys, так как он не поддерживается в старых версиях IE. Но если вам это действительно нужно, вы можете использовать приведенный выше код для гарантии обратной совместимости:

if (!Object.keys) {
Object.keys = (function () {
var hasOwnProperty = Object.prototype.hasOwnProperty,
    hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
    dontEnums = [
      'toString',
      'toLocaleString',
      'valueOf',
      'hasOwnProperty',
      'isPrototypeOf',
      'propertyIsEnumerable',
      'constructor'
    ],
    dontEnumsLength = dontEnums.length;

return function (obj) {
  if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');

  var result = [];

  for (var prop in obj) {
    if (hasOwnProperty.call(obj, prop)) result.push(prop);
  }

  if (hasDontEnumBug) {
    for (var i=0; i < dontEnumsLength; i++) {
      if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
    }
  }
  return result;
}})()};

Функция Firefox (Gecko) 4 (2.0) Chrome 5 Internet Explorer 9 Opera 12 Safari 5

Подробнее: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys

Но если вам нужен только первый, мы могли бы предложить более короткое решение, например:

var data = {"key1":"123","key2":"456"};
var first = {};
for(key in data){
    if(data.hasOwnProperty(key)){
        first.key = key;
        first.content =  data[key];
        break;
    }
}
console.log(first); // {key:"key",content:"123"}
2 голосов
/ 12 июня 2009

Это было рассмотрено здесь раньше.

Концепция first не применяется к свойствам объекта, и порядок цикла for ... in не гарантируется спецификациями, однако на практике это надежно FIFO , за исключением критически для хрома ( сообщение об ошибке ). Принимайте соответствующие решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...