Как получить доступ к первому свойству объекта в 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