JavaScript: получить первое и единственное имя свойства объекта - PullRequest
35 голосов
/ 20 июля 2011

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

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

Ответы [ 6 ]

44 голосов
/ 20 июля 2011

Может быть Object.keys может работать на вас. Если его длина возвращает 1, вы можете использовать yourObject[Objects.keys[0]], чтобы получить единственное свойство объекта. MDN-link также показывает пользовательскую функцию для использования в средах без 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

13 голосов
/ 20 июня 2015

Кратчайшая форма:

instance[Object.keys(instance)[0]];

ES6 + функция:

let first = v => v[Object.keys(v)[0]];

Используйте функцию:

first({a:'first', b:'second'}) // return 'first'
2 голосов
/ 20 июля 2011

К сожалению, нет встроенной функции "list properties", и, конечно, нет "getFirstProperty" (тем более что нет гарантии, что какое-либо свойство будет последовательно "first").

Я думаю, вам лучше написать такую ​​функцию:

/**
 * 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));
1 голос
/ 20 июля 2011

Хотя мой ответ опущен, все же стоит знать, что нет такой вещи, как порядок ключей в объекте javascript. Следовательно, теоретически любой код, основанный на повторяющихся значениях, может быть противоречивым. Одним из подходов может быть создание объекта и определение сеттера, который фактически обеспечивает подсчет, упорядочение и т. Д., И предоставляет несколько методов для доступа к этим полям. Это можно сделать в современных браузерах.

Итак, чтобы ответить на ваш вопрос, в целом вы подходите по-прежнему наиболее closs-браузер. Вы можете выполнять итерации, используя lodash или любой другой современный фреймворк, который скроет от вас сложность hasOwnProperty. По состоянию на август 15 Object.keys может быть принят как кросс-браузерный и универсальный. Ведь IE8 произошел много лет назад. Тем не менее, в некоторых случаях вы просто не сохраняете весь набор ключей в массиве. Но я бы пошел с Object.keys - он более гибкий по сравнению с итерацией.

0 голосов
/ 25 сентября 2018
  var foo = {bar: 1};
  console.log(Object.keys(foo).toString());

, которая напечатает строку

"bar"
0 голосов
/ 30 сентября 2016

Это старый пост, но в итоге я написал следующую вспомогательную функцию, основанную на 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;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...