JavaScript: получить первое и единственное имя свойства объекта
Если я хочу перечислять свойства объекта и игнорировать прототипы, я бы использовал:
var instance = { ... };
for (var prop in instance) {
if (instance.hasOwnProperty(prop)) {
...
}
}
Что делать, если instance
имеет только одно свойство, и я хочу получить это имя свойства? Есть ли более простой способ, чем это сделать:
var instance = { id: "foobar" };
var singleMember = (function() {
for (var prop in instance) {
if (instance.hasOwnProperty(prop)) {
return prop;
}
}
})();
Ответы
Ответ 1
Может быть Object.keys может работать на вас. Если его длина возвращает 1, вы можете использовать yourObject[Objects.keys[0]]
, чтобы получить единственное свойство объекта. MDN-ссылка также показывает пользовательскую функцию для использования в средах без метода keys
1. Код вроде этого:
var obj = {foo:'bar'},
kyz = Object.keys(obj);
if (kyz.length === 1){
alert(obj[kyz[0]]); //=> 'bar'
} else {
/* loop through obj */
}
1 Некоторые старые браузеры не поддерживают Object.keys
. Ссылка MDN поставляет код, чтобы он работал в этих браузерах. См. Заголовок Совместимость на вышеупомянутой странице MDN
Ответ 2
Кратчайшая форма:
instance[Object.keys(instance)[0]];
Функция ES6 +:
let first = v => v[Object.keys(v)[0]];
Используйте функцию:
first({a:'first', b:'second'}) // return 'first'
Ответ 3
К сожалению, нет встроенной функции "свойств списка", и, безусловно, нет "getFirstProperty" (тем более, что нет гарантии, что какое-либо свойство будет последовательно "первым" ).
Я думаю, вам лучше написать такую функцию, как этот:
/**
* A means to get all of the keys of a JSON-style object.
* @param obj The object to iterate
* @param count maximum length of returned list (defaults to Infinity).
*/
function getProperties( obj, count )
{
if( isNaN( count ) ) count = Infinity
var keys = []
for( var it in obj )
{
if( keys.length > count ) break;
keys.push( it );
}
return keys;
}
Затем вы можете получить доступ к имени, но:
instance = {"foo":"bar"}
// String() on an array of < 2 length returns the first value as a string
// or "" if there are no values.
var prop = String(getProperties(instance, 1));
Ответ 4
Хотя мой ответ ниспровергнут, все равно стоит знать, что существует no такая вещь, как порядок ключей в объекте javascript. Поэтому теоретически любой код, основанный на итерирующих значениях, может быть непоследовательным. Один из подходов может заключаться в создании объекта и определении сеттера, который фактически обеспечивает подсчет, упорядочение и т.д., И предоставляет некоторые методы для доступа к этим полям. Это можно сделать в современных браузерах.
Итак, чтобы ответить на ваш вопрос, в целом вы подходите по-прежнему наиболее closs-браузером. Вы можете повторять использование lodash или любой другой современной структуры, которая скроет от вас сложность "hasOwnProperty". По состоянию на август'15 Object.keys
можно принять как кросс-браузер и универсальный. Ведь IE8 произошел много лет назад. Тем не менее, есть некоторые случаи, когда вы просто не хотите хранить весь набор ключей в массиве. Но я бы пошел с Object.keys - он был более гибким по сравнению с итерацией.
Ответ 5
Это старый пост, но в итоге я написал следующую вспомогательную функцию, основанную на Object.keys().
Он возвращает key
и value
первого свойства.
getFirstPropertyKeyAndValue(sourceObject) {
var result = null;
var ownProperties = Object.keys(sourceObject);
if (ownProperties.length > 0) {
if (ownProperties.length > 1) {
console.warn('Getting first property of an object containing more than 1 own property may result in unexpected results. Ordering is not ensured.', sourceObject);
}
var firstPropertyName = ownProperties[0];
result = {key: firstPropertyName, value: sourceObject[firstPropertyName]};
}
return result;
}