Подтвердить что ты не робот

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;
        }
    }
})();
4b9b3361

Ответ 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;
  }