Tengo un objeto de datos bastante grande y cada vez que actualizo la página tengo que reanudar los datos de esa agua. ¿Hay alguna manera de que pueda hacer un forEach más rápido?
if (Object.keys(jsonData.data.users).length > 0) { Object.keys(jsonData.data.users).forEach((username) => { const user = jsonData.data.users[username]; const register_date = new Date(user.register_date); if (register_date >= start_date && register_date <= end_date) { data.guestsNumber++; } actions += user.actions_per_session; session_duration += user.session_duration; data.cartViews += user.cart_views; }) data.actionsPerSession = (actions / (Object.keys(jsonData.data.users).length)).toFixed(2); data.averageSessionDuration = (session_duration / (Object.keys(jsonData.data.users).length)).toFixed(2); }¿Qué formas habría de dar un mejor momento?
En general, esto parece lo suficientemente rápido. Puede tomar algunos puntos de referencia a través de jsbench.me , pero creo que tendrá que mirar más allá del código para rediseñar los tiempos generales de carga de la página.
Pero así es como refactorizaría el código para exprimir el rendimiento
Puede convertir if (arr.length > 0) { arr.forEach(...) } para simplemente hacer arr.forEach(...) . Si la matriz está vacía, forEach simplemente nunca activará la devolución de llamada, pero seguirá siendo válida. Eso evita hacer Object.keys(jsonData.data.users) dos veces.
Además, está llamando a Object.keys(jsonData.data.users) 4 veces diferentes; debería ser un poco más rápido asignar a una variable y reutilizarla.
Entonces debería verse así:
var users = Object.keys(jsonData.data.users); users.forEach((username) => { const user = jsonData.data.users[username]; const register_date = new Date(user.register_date); if (register_date >= start_date && register_date <= end_date) { data.guestsNumber++; } actions += user.actions_per_session; session_duration += user.session_duration; data.cartViews += user.cart_views; }) data.actionsPerSession = (actions / (users.length)).toFixed(2); data.averageSessionDuration = (session_duration / (users.length)).toFixed(2);