Длина объекта JavaScript

Оператор == на списках и dicts не сравнивает идентификаторы объектов, чтобы увидеть, являются ли они одним и тем же объектом. Для этого используйте obj1 is obj2.

Вместо этого оператор == сравнивает членов списка из dict, чтобы узнать, совпадают ли они.

2185
задан Penny Liu 18 September 2019 в 18:58
поделиться

6 ответов

Самый устойчивый ответ (т.е. это получает намерение того, что Вы пытаетесь сделать при порождении наименьшего количества ошибок), был бы:

Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

// Get the size of an object
var size = Object.size(myObj);

существует своего рода конвенция в JavaScript, что Вы не добавляете вещи к Object.prototype, потому что это может повредить перечисления в различных библиотеках. Добавление методов для Возражения обычно безопасно, все же.

<час>

Вот обновление по состоянию на 2016 и широко распространенное развертывание ES5 и вне. Для IE9 + и весь другой современный ES5 + способные браузеры, можно использовать Object.keys() , таким образом, вышеупомянутый код просто становится:

var size = Object.keys(myObj).length;

Это не должно изменять существующий прототип, так как Object.keys() теперь встроен.

Редактирование : Объекты могут иметь символьные свойства, которые не могут быть возвращены с помощью метода Object.key. Таким образом, ответ был бы неполным, не упоминая их.

тип Символа был добавлен к языку для создания уникальных идентификаторов для свойств объектов. Основное преимущество типа Символа является предотвращением перезаписей.

Object.keys или Object.getOwnPropertyNames не работает на символьные свойства. Для возврата их, необходимо использовать Object.getOwnPropertySymbols.

var person = {
  [Symbol('name')]: 'John Doe',
  [Symbol('age')]: 33,
  "occupation": "Programmer"
};

const propOwn = Object.getOwnPropertyNames(person);
console.log(propOwn.length); // 1

let propSymb = Object.getOwnPropertySymbols(person);
console.log(propSymb.length); // 2
2407
ответ дан Pauli Sudarshan Terho 18 September 2019 в 18:58
поделиться

Я не эксперт JavaScript, но похоже, что необходимо было бы циклично выполниться через элементы и считать их, так как Объект не имеет метода длины:

var element_count = 0;
for (e in myArray) {  if (myArray.hasOwnProperty(e)) element_count++; }

@palmsey: Объективности ради по отношению к OP документация JavaScript на самом деле явно относится к использованию переменных текстового объекта этим способом как "ассоциативные массивы".

34
ответ дан Peter Mortensen 18 September 2019 в 18:58
поделиться

Вот то, как и не забывают проверять, что свойство не находится на опытной цепочке:

var element_count = 0;
for(var e in myArray)
    if(myArray.hasOwnProperty(e))
        element_count++;
18
ответ дан Kev 18 September 2019 в 18:58
поделиться
  • 1
    @Chris, нет, лучший подход является структурой кода. Don' t бросают случайный mallocs, и освобождает на всем протяжении Вашей кодовой базы, держите связанные вещи вместе. " module" это выделяет ресурс (память, файл...) ответственно за освобождение его и должен обеспечить функцию для того, чтобы сделать так, чтобы сохранил заботу об указателях, также. Для любого определенного ресурса у Вас тогда есть точно одно место, где это выделяется и одно место, где это выпущено, оба близко друг к другу. – Secure 10 December 2009 в 18:00

@palmsey: Объективности ради по отношению к OP документы JavaScript на самом деле явно относятся к использованию переменных текстового объекта этим способом как "ассоциативные массивы".

И объективности ради по отношению к @palmsey он был довольно корректен, они не ассоциативные массивы, они - определенно объекты :) - выполнение задания ассоциативного массива. Но в отношении более широкой точки Вы определенно, кажется, имеете право его в соответствии с этой довольно прекрасной статьей, которую я нашел:

“Associative Arrays” JavaScript, Продуманный Вредный

, Но согласно всему этому, [разве] эти , не принят, отвечают самому плохая практика?

Указывают опытный размер () функция для Объекта

, Если что-либо еще было добавлено для Возражения .prototype, затем предложенный код перестанет работать:

<script type="text/javascript">
Object.prototype.size = function () {
  var len = this.length ? --this.length : -1;
    for (var k in this)
      len++;
  return len;
}
Object.prototype.size2 = function () {
  var len = this.length ? --this.length : -1;
    for (var k in this)
      len++;
  return len;
}
var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
alert("age is " + myArray["age"]);
alert("length is " + myArray.size());
</script>

я не думаю, что ответ должен быть принятым, поскольку он не может быть доверен работе, если у Вас есть какой-либо другой код, работающий в том же контексте выполнения. Чтобы сделать это устойчивым способом, конечно, необходимо было бы определить метод размера в myArray и проверке на тип участников, поскольку Вы выполняете итерации через них.

14
ответ дан Community 18 September 2019 в 18:58
поделиться
  • 1
    Макро-версия имеет тонкую ошибку при использовании ее после если оператор без скобок. – Mark Ransom 24 June 2009 в 09:11

Используйте Object.keys(myObject).length для получения длины объекта/массива

var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

console.log(Object.keys(myObject).length); //3
2
ответ дан 22 November 2019 в 19:55
поделиться

У меня была подобная потребность вычислить пропускную способность, используемую объектами, полученными по websocket. Просто нахождение длины объекта Stringified было достаточно для меня.

websocket.on('message', data => {
    dataPerSecond += JSON.stringify(data).length;
}
-1
ответ дан 22 November 2019 в 19:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: