Как получить длину JavaScript-объекта

линейка

В JavaScript почти всё является объектом. Объекты используются для хранения информации в парах key-value, где значением может быть любой другой тип данных или функция. В отличие от массивов и строк, объекты не имеют предопределенного свойства, которое возвращает их длину.

Поэтому, если попытаться получить значение свойства length объекта, возвращается undefined. Вот, например, три Javascript-способа получить длину объекта, назовём его myObj.

const myObj = {
  key1: 'val1',
  key2: 'val2',
  key3: 'val3',
  key4: 'val4',
};

Object.keys()

Метод Object.keys() возвращает массив названий ключей, затем можно прочитать его свойство length и получить длину объекта.

console.log(Object.keys(myObj).length); // 4

Цикл for..in

Получить длину объекта можно, перебрав все его свойства в цикле.

let count = 0;
for (let key in myObj) {
  count++;
}
console.log(count); // 4

Добавление свойства length для Object.prototype

Если добавить свойство length к прототипу объекта, его можно будет неоднократно использовать во всём приложении.

if (!Object.prototype.length) {
  Object.defineProperty(Object.prototype, 'length', {
    get: function() {
      return Object.keys(this).length;
    }
  });
}

Преимущества последнего варианта достаточно очевидны: один раз определить и использовать свойство из любого места приложения, отсутствие цикла для перебора и подсчёта ключей объекта.