Как получить доступ к первому свойству объекта в Javascript?

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

  • где вы не знаете имя своих свойств
  • без использования цикла типа for .. in или jQuery $.each

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

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

Ответ 1

var obj = { first: 'someVal' };
obj[Object.keys(obj)[0]]; //returns 'someVal'

Используя это, вы можете получить доступ и к другим свойствам по индексам. Будьте внимательны! Object.keys возврата Object.keys не гарантируется в соответствии с ECMAScript, однако неофициально он является всеми основными реализациями браузеров, пожалуйста, прочитайте fooobar.com/questions/3724/... для подробностей об этом.

Ответ 2

Попробуйте for … in loop и перерыв после первой итерации:

for (var prop in object) {
    // object[prop]
    break;
}

Ответ 3

Используйте 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 не определен.

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

var val = example[function() { for (var k in example) return k }()];

Ответ 7

Нет. Объектный литерал, определенный в MDC:

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

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

Ответ 8

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

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

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

Ответ 9

Я не рекомендую использовать 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"}

Ответ 10

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

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

Ответ 11

var obj = { first: 'someVal' };
let firstPropValue = Object.values(obj)[0];

Это всегда будет возвращать значение 1-го свойства, в данном случае 'someVal'

Ответ 12

Если вам нужно получить доступ к "первому свойству объекта", это может означать, что с вашей логикой что-то не так. Порядок свойств объекта не имеет значения.

Ответ 13

Используйте массив вместо объекта (квадратные скобки).

var example = [ {/* stuff1 */}, { /* stuff2 */}, { /* stuff3 */}];
var fist = example[0];

Обратите внимание, что вы теряете идентификаторы "foo". Но вы можете добавить свойство name к содержащимся объектам:

var example = [ 
  {name: 'foo1', /* stuff1 */},
  {name: 'foo2', /* stuff2 */},
  {name: 'foo3', /* stuff3 */}
];
var whatWasFirst = example[0].name;

Ответ 14

Есть причина не делать этого?

> example.map(x => x.name);

(3) ["foo1", "foo2", "foo3"]

Ответ 15

Чтобы получить первое имя ключа в объекте, вы можете использовать:

var obj = { first: 'someVal' };
Object.keys(obj)[0]; //returns 'first'

Возвращает строку, поэтому вы не можете получить доступ к вложенным объектам, если они есть, например:

var obj = { first: { someVal: { id: 1} }; Здесь с этим решением вы не можете получить доступ к идентификатору.

Лучшее решение, если вы хотите получить реальный объект, это использовать lodash, например:

obj[_.first(_.keys(obj))].id

Чтобы вернуть значение первого ключа (если вы не знаете точно имя первого ключа):

var obj = { first: 'someVal' };
obj[Object.keys(obj)[0]]; //returns 'someVal'

если вы знаете имя ключа, просто используйте:

obj.first

или же

obj['first']

Ответ 16

Еще один эффективный ярлык

var obj = { first: 'someVal' };
Object.entries(obj)[0][1] // someVal