Как эффективно посчитать количество ключей / свойств объекта в JavaScript?

У меня есть исходный код для обнаружения человеческого лица и возвращает не только глубину, но и координаты реального мира с левой камерой (или правой камерой, я не мог вспомнить), являющейся источником. Он адаптирован из исходного кода «Learning OpenCV» и относится к некоторым веб-сайтам, чтобы заставить его работать. Результат, как правило, довольно точный.

1388
задан Luc125 26 May 2013 в 19:24
поделиться

4 ответа

Я не знаю ни о каком способе сделать это, однако свести повторения к минимуму, Вы могли попытаться проверить на существование __count__ и если это не существует (т.е. не Firefox) тогда, Вы могли бы выполнить итерации по объекту и определить его для более позднего использования, например:

if (myobj.__count__ === undefined) {
  myobj.__count__ = ...
}

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

if (myobj.__count__ === undefined) {
  myobj.__count__ = function() { return ... }
  myobj.__count__.toString = function() { return this(); }
}

Этот путь каждый раз, когда Вы ссылаетесь на myobj. __count__ функция будет стрелять и повторно вычислять.

15
ответ дан Luke Bennett 26 May 2013 в 19:24
поделиться

Если бы Вы на самом деле сталкиваетесь с проблемой производительности, я предложил бы обернуть вызовы, которые добавляют/удаляют свойства, to/from объект с функцией, которая также увеличивает/постепенно уменьшает соответственно именованный (размер?) свойство.

только необходимо вычислить начальное количество свойств однажды и идти дальше оттуда. Если нет фактической проблемы производительности, не беспокоиться. Просто обертка, что бит кода в функции getNumberOfProperties(object) и быть сделанным с ним.

26
ответ дан hitautodestruct 26 May 2013 в 19:24
поделиться

Я не думаю, что это возможно (по крайней мере, не используя некоторые внутренности). И я не думаю, что Вы получили бы много путем оптимизации этого.

0
ответ дан amix 26 May 2013 в 19:24
поделиться

Вот некоторые тесты производительности для трех методов;

https://jsperf.com/get-the-number-of-keys-in-an-object

Object.keys () операции в секунду .length

20,735

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

return Object.keys(objectToRead).length;

цикл через ключи

15,734 операции в секунду

let size=0;
for(let k in objectToRead) {
  size++
}
return size;

Немного медленнее, но нигде около использования памяти, так вероятно, лучше, если Вы интересуетесь оптимизацией для мобильных или других маленьких машин

Используя Карту вместо Объекта

953,839,338 операции в секунду

return mapToRead.size;

В основном, Карта отслеживает свой собственный размер, таким образом, мы просто возвращаем числовое поле. Далеко, намного быстрее, чем какой-либо другой метод. Если Вы имеете контроль над объектом, преобразовываете их в карты вместо этого.

0
ответ дан 22 November 2019 в 20:19
поделиться
Другие вопросы по тегам:

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