Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.12.2015, 10:11
Интересующийся
Отправить личное сообщение для iwtn Посмотреть профиль Найти все сообщения от iwtn
 
Регистрация: 24.12.2013
Сообщений: 16

Object.keys(obj).length медленный. Есть ли способы быстрее?
Привет.
Для больших объектов Object.keys(obj).length довольно медленный особенно в Chrome. Самый быстрый в FF.
Ну то есть у меня к примеру следующий код в Chrome выполняется больше полсекунды. Это уже многовато. Есть ли способы быстрее посчитать кол-во свойств у объекта?

var i,data={},count1,count2,t1,t2,str="";

for (i=1;i<=777777;i++)
    data["id"+i]="string"+Math.random();

//1
t1 = performance.now();
count1=Object.keys(data).length;
t2 = performance.now();
//console.log("Время (1 вариант): "+(t2-t1).toFixed(4)+" мс\n\n");
str="Время (1 вариант): "+(t2-t1).toFixed(4)+" мс\n\n";

//2
t1 = performance.now();
count2=0;
for (i in data) {
    count2++;
}
t2 = performance.now();
//console.log("Время (2 вариант): "+(t2-t1).toFixed(4)+" мс\n\n");
str+="Время (2 вариант): "+(t2-t1).toFixed(4)+" мс\n\n";
alert(str);
Ответить с цитированием
  #2 (permalink)  
Старый 05.12.2015, 11:21
Аватар для Safort
Профессор
Отправить личное сообщение для Safort Посмотреть профиль Найти все сообщения от Safort
 
Регистрация: 23.12.2013
Сообщений: 1,856

Используй Map. У объектов Map есть свойство size.
Ответить с цитированием
  #3 (permalink)  
Старый 05.12.2015, 11:40
Интересующийся
Отправить личное сообщение для iwtn Посмотреть профиль Найти все сообщения от iwtn
 
Регистрация: 24.12.2013
Сообщений: 16

А если изначально есть только объект. Можно его как-то в map преобразовать?

Тут непонятна такая тема, по идее Object.keys(data).length это просто кол-во свойств, ну как array.length, т.е. он должен моментально возвращать, а получается что видимо браузеры их считают что ли. FF правда быстрее всех.
Ответить с цитированием
  #4 (permalink)  
Старый 05.12.2015, 11:47
Интересующийся
Отправить личное сообщение для iwtn Посмотреть профиль Найти все сообщения от iwtn
 
Регистрация: 24.12.2013
Сообщений: 16

Кстати как с поддержкой map в браузерах?
Здесь вот обозначено что это только стандарт ES-2015
Ответить с цитированием
  #5 (permalink)  
Старый 05.12.2015, 13:40
Интересующийся
Отправить личное сообщение для madCoder Посмотреть профиль Найти все сообщения от madCoder
 
Регистрация: 01.12.2015
Сообщений: 10

Object.keys.length это не array.length ))

это что то такое )))
Object.prototype.KEYS = function () {
var arr = [];
for(var i in this) if(this.hasOwnProperty(i)) arr.push(i)

return arr;
}


если объект сам создаешь то просто записывай свойство length в объект и enumerable = false https://developer.mozilla.org/ru/doc...defineProperty

Последний раз редактировалось madCoder, 05.12.2015 в 13:51.
Ответить с цитированием
  #6 (permalink)  
Старый 07.12.2015, 13:26
Интересующийся
Отправить личное сообщение для iwtn Посмотреть профиль Найти все сообщения от iwtn
 
Регистрация: 24.12.2013
Сообщений: 16

Сообщение от madCoder Посмотреть сообщение
Object.keys.length это не array.length ))
это что то такое )))
Object.prototype.KEYS = function () {
var arr = [];
for(var i in this) if(this.hasOwnProperty(i)) arr.push(i)

return arr;
}
А почему тогда второй способ медленнее? Там тот же цикл и один оператор.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Присвоить разные class элементу li, какаие есть способы? aleksandr8i Javascript под браузер 11 12.03.2015 23:46
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37
document.XMLDocument - есть ли в FF? IIIEPJIOK Events/DOM/Window 0 26.02.2009 00:19
Проблема onmouseout если есть вложенные теги... AlexPa Общие вопросы Javascript 5 27.01.2009 19:59
Загружаем себе чужой сайт, есть способы? sshz Общие вопросы Javascript 14 13.01.2009 00:54