Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Object.keys(obj).length медленный. Есть ли способы быстрее? (https://javascript.ru/forum/misc/59974-object-keys-obj-length-medlennyjj-est-li-sposoby-bystree.html)

iwtn 05.12.2015 10:11

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

Safort 05.12.2015 11:21

Используй Map. У объектов Map есть свойство size.

iwtn 05.12.2015 11:40

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

Тут непонятна такая тема, по идее Object.keys(data).length это просто кол-во свойств, ну как array.length, т.е. он должен моментально возвращать, а получается что видимо браузеры их считают что ли. FF правда быстрее всех.

iwtn 05.12.2015 11:47

Кстати как с поддержкой map в браузерах?
Здесь вот обозначено что это только стандарт ES-2015

madCoder 05.12.2015 13:40

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

iwtn 07.12.2015 13:26

Цитата:

Сообщение от madCoder (Сообщение 398817)
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;
}

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


Часовой пояс GMT +3, время: 06:58.