Contactos

Javascript atravesando una matriz. Todas las formas de iterar a través de una matriz en JavaScript. para cada método y métodos relacionados

Un artículo en el que veremos ejemplos del uso de jQuery en cada función y método.

La biblioteca jQuery tiene 2 entidades diferentes llamadas cada una.

La primera (jQuery.each) es una función jQuery universal que se puede utilizar para iterar sobre los elementos de una matriz u objeto.

El segundo (cada uno) es un método que se aplica a un conjunto de elementos para recorrerlos.

Cada bucle (jQuery.each). Ejemplos de uso

Sintaxis de cada función:

// matriz u objeto - una matriz u objeto cuyos elementos o propiedades necesitan ser iterados // devolución de llamada - una función que se ejecutará para cada elemento de la matriz u objeto propiedad $.each(array or object,callback);

Veamos cómo trabajar con cada función usando ejemplos.

Ejemplo No. 1. En él, recorreremos todos los elementos de la matriz.

// matriz que consta de 3 líneas var arr = ["Coche","Camión","Autobús"]; // iteremos a través de la matriz arr $.each(arr,function(index,value)( // acciones que se realizarán para cada elemento de la matriz // índice es el índice actual del elemento de la matriz (número) // valor es el valor del elemento de la matriz actual // genera el índice y el valor de la matriz en la consola console.log("Índice: " + índice + "; Valor: " + valor); )); /* Resultado (en consola): Índice: 0; Valor: Índice de coche: 1; Valor: Índice de camiones: 2; Valor: Autobús */

En el código anterior, cada función se utiliza para iterar a través de la matriz. La función tiene 2 parámetros requeridos. El primer parámetro es la entidad (matriz u objeto) cuyos elementos (propiedades) deben iterarse. En este caso, es la matriz arr. El segundo parámetro es una función de devolución de llamada que se ejecutará para cada elemento (en este caso) de la matriz. Dispone de 2 parámetros, a los que se puede acceder en su interior a través de las variables correspondientes. El primer parámetro es el número de serie del elemento (contando desde 0). El segundo parámetro es el valor del elemento de la matriz actual.

Ejemplo No. 2. En este ejemplo, recorreremos todas las propiedades de un objeto.


// objeto de teléfono inteligente que tiene 5 propiedades var smartphone = ( "nombre": "LG G5 se", "año": "2016", "tamaño de pantalla": "5.3", "resolución de pantalla": "2560 x 1440 " , "os": "Android 6.0 (Marshmallow)"); // iterar sobre el objeto del teléfono inteligente $.each(smartphone, function(key, value) ( ​​// acciones que se realizarán para cada propiedad del objeto // key - el nombre actual de la propiedad de la matriz // valor - el valor de la propiedad actual del objeto // muestra el nombre de la propiedad y su valor en la consola console.log("Propiedad: " +clave + "; Valor: " + valor); )); /* Resultado (en la consola): Propiedad: nombre; Valor: LG G5 se Propiedad: año; Valor: 2016 Propiedad: tamaño de pantalla; Valor: 5,3 Propiedad: resolución de pantalla; Valor: 2560 x 1440 Propiedad: os; Valor: Android 6.0 (Marshmallow) */

La función each se puede utilizar para iterar sobre objetos JavaScript. La única diferencia en su uso es que los parámetros de la función de devolución de llamada tienen significados diferentes. El primer parámetro almacena el nombre de la propiedad del objeto y el segundo, el valor de esta propiedad.

Ejemplo No. 3. En él, enumeraremos una estructura más compleja (veamos cómo usar each anidado).

// objeto que consta de 2 propiedades. Cada propiedad de este objeto tiene como valor una matriz, cuyos elementos también son objetos var artículos = ( "Bootstrap": [ ("id":"1", "title":"Introducción"), ("id" :"2" , "title":"Cómo instalar"), ("id":"3", "title":"Grid") ], "JavaScript": [ ("id":"4", " title":"Conceptos básicos "), ("id":"5", "title":"Selección de elementos") ] ); $.each(artículos,función(clave,datos) ( console.log("Sección: " + clave); $.each(datos, función(índice,valor) ( ​​console.log("Artículo: id = " + valor ["id"] + "; Título = "+ valor["título"]); )); )); /* Resultado: Sección: Artículo Bootstrap: id = 1; Título = Introducción Artículo: id = 2; Título = Cómo instalar Artículo: id = 3; Título = Cuadrícula Sección: JavaScript Artículo: id = 4; Título = Conceptos básicos Artículo: id = 5; Nombre = Selección de elementos */

¿Cómo interrumpir cada uno (salir del ciclo)?

La ruptura de cada bucle se realiza mediante la declaración de retorno, que debe devolver falso.

Por ejemplo, interrumpamos la ejecución de cada bucle después de encontrar el número 7 en la matriz arr:

// matriz que consta de 5 números var arr = ; // número a encontrar var find = 7; // iteremos a través de la matriz arr $.each(arr, function (index, value) ( ​​​​// si se encuentra el número requerido, entonces... if (value === find) ( // imprimirlo en el console console.log("¡Hurra! ¡Se encontró el número " + find + "! Este número tiene un índice: " + index); // interrumpe el ciclo return false; ) else ( // de lo contrario imprime el número actual en la consola console.log("Número actual: " + valor); ) )); /* Resultado (en consola): Número actual: 5 Número actual: 4 ¡Hurra! ¡Número 7 encontrado! Este número tiene un índice: 2 */

¿Cómo pasar a la siguiente iteración (cada una continúa)?

En cada uno, la interrupción de la iteración actual y el paso a la siguiente se realiza mediante la declaración de retorno, que debe tener un valor distinto de falso.

// matriz formada por números var arr = ; // una matriz que debe contener todos los elementos de la matriz arr, excepto los números pares var newarr = ; // iterar a través de la matriz arr $.each(arr, function (index, value) ( ​​​​// si el elemento es par, omitirlo if (value % 2 === 0) ( // interrumpir la iteración actual y pasa al siguiente return; ) // agrega valor a la matriz newarr newarr.push(value); )); console.log("Matriz inicial (arr): " + arr.join()); console.log("Matriz resultante (newarr): " + newarr.join()); /* Resultado (en consola): Matriz inicial (arr): 3,5,4,9,17,19,30,35,40 Matriz resultante (newarr): 3,5,9,17,19,35 */

Recorriendo los elementos actuales (.each)

Sintaxis de cada método (se aplica solo a elementos seleccionados):


.cada(función); // función: una función que se ejecutará para cada elemento del objeto actual

Veamos cómo funciona el método .each usando el siguiente ejemplo (iteremos sobre elementos div):

// después de cargar el DOM de la página, ejecuta $(function())( // iterar a través de los elementos div en la página $("div").each(function (index, element) ( // index (number) - el índice actual de la iteración (ciclo) // este valor es un número // comienza a contar desde 0 y termina con el número de elementos en el conjunto actual menos 1 // elemento - contiene una referencia DOM a la consola del elemento actual. log("Índice del elemento Div: " + índice + "; id del elemento = " + $(elemento).attr("id")); )); )); // Resultado: // Índice del elemento div: 0; id del elemento = id1 // índice del elemento div: 1; id del elemento = id2 // índice del elemento div: 2; identificación del elemento = id3

En el ejemplo anterior, cada método utiliza el conjunto actual (los elementos seleccionados mediante el selector $("div")). El controlador de cada método es siempre una función que se ejecutará para cada elemento del conjunto actual (en este caso, para cada elemento div). Esta función tiene 2 parámetros opcionales. Uno de ellos (índice) es el número de serie de la iteración actual y el segundo (elemento) es un enlace DOM al elemento actual. Además, la palabra clave this está disponible dentro de la función, que, al igual que el segundo parámetro, contiene una referencia DOM al elemento actual.

Por ejemplo, envíemos a la consola el valor del atributo href para todos los elementos a de la página:

$("a").each(function() ( console.log($(this).attr("href")); ));

$("a").each(function() ( var enlace = $(this).attr("href"); if ((link.indexOf("http://") == 0) || (enlace .indexOf("https://") == 0)) ( console.log("href links = " + enlace); ) )); // Si los siguientes enlaces se encuentran en la página: // Yandex // ¿Cómo funciona JavaScript? // Bootstrap // Luego en la consola veremos el siguiente resultado: // https://www.yandex.ru/ // http://getbootstrap.com/

Por ejemplo, veamos cómo organizar cada bucle sobre elementos DOM que tienen el nombre clase (iteremos sobre todos los elementos de la misma clase).

Cómputo de placa única Raspberry pi Intel Galileo Gen2 $19 Pine A64 Plus // usando la función jQuery.each ($.each) $.each($(".name"),function(index,data) ( console.log( "Ordinal número: " + índice + " ; Contenido: " +$(datos).text()); )); // usando el método jQuery .each $(".name").each(function(index,data) ( console.log("Ordinal: " + index + " ; Contenido: " +$(data).text() ); )); // Recibiremos la siguiente respuesta: // Número de secuencia: 0 ; Contenido: Raspberry pi // Número de secuencia: 1; Contenido: Intel Galileo Gen2 // Número de secuencia: 2; Contenido: Pino A64 Plus

Por ejemplo, veamos cómo recorrer en iteración todos los elementos de una página.

$("*").each(function() ( console.log(this); ));

Por ejemplo, mostremos el valor de todos los elementos de entrada en la página.

$("entrada").cada(función() ( console.log($(this).val()); ));

Por ejemplo, repitamos todos los elementos secundarios ubicados en ul con id="myList" (cada uno de los elementos secundarios).

  • HTML
  • javascript
$("ul#myList").children().each(function())( console.log($(this).text()); )); // Resultado: // HTML // CSS // JavaScript

Veamos una forma de determinar el último índice (elemento) en cada método de jQuery.

// selecciona elementos var myList = $("ul li"); // determina el número de elementos en la selección var total = myList.length; // iterar a través de los elementos seleccionados myList.each(function(index) ( if (index === total - 1) ( // este es el último elemento de la selección ) ));

22 respuestas

Después de ejecutar esta prueba con la mayoría de los navegadores modernos...

Actualmente, la forma de bucle más rápida (y en mi opinión, la más obvia desde el punto de vista sintáctico).

estándar para bucle almacenado en caché de longitud

Para (var i = 0, len = myArray.length; i< len; i++) { }

Yo diría que este es definitivamente un caso en el que aplaudo a los desarrolladores de motores JavaScript. El tiempo de ejecución debe optimizarse para mayor claridad, no para conveniencia.

En junio de 2016, se realizaron varias pruebas en la última versión de Chrome (71% del mercado de navegadores en mayo de 2016 y en aumento):

  • El bucle más rápido es el bucle, con y sin longitud de caché, que proporciona un rendimiento muy similar. (Un bucle for con una longitud almacenada en caché a veces produce mejores resultados que uno que no está almacenado en caché, pero la diferencia es casi insignificante, lo que significa que el motor puede optimizarse a favor del bucle estándar y quizás más simple sin caché).
  • El bucle while con decrementos era aproximadamente 1,5 veces más lento que el bucle for.
  • Un bucle que utiliza una función de devolución de llamada (por ejemplo, forEach estándar) era aproximadamente 10 veces más lento que un bucle for.

Creo que este hilo es demasiado antiguo y los programadores sienten que necesitan almacenar en caché la longitud o usar intersecciones para disminuir hacia atrás para lograr un mejor rendimiento, escribiendo código que sea menos exigente y más propenso a errores que un simple bucle for. Por eso recomiendo:

    Si su aplicación itera a través de muchos elementos, o su código de bucle está dentro de una función que se usa con frecuencia, la respuesta es un bucle directo:

    Para (var i = 0; i< arr.length; i++) { // Do stuff with arr[i] or i }

    Si su aplicación realmente no itera sobre muchos elementos o simplemente necesita hacer pequeñas iteraciones aquí y allá, usar la devolución de llamada estándar forEach o cualquier función similar de su biblioteca JS de elección puede ser más limpio y menos propenso a errores desde el índice. El alcance de la variable es privado y no es necesario utilizar paréntesis para acceder directamente al valor de la matriz:

    Arr.forEach(function(value, index) ( // Hacer cosas con valor o índice ));

    Si realmente necesita combinar unos cuantos milisegundos mientras itera sobre miles de millones de filas, y la longitud de la matriz no cambiará en el proceso, podría considerar almacenar en caché la longitud en un bucle for. Aunque creo que actualmente no es necesario:

    Para (var i = 0, len = longitud del arreglo; i< len; i++) { // Do stuff with arr[i] }

Estamos apenas en 2018, por lo que una actualización podría ser buena...

Y realmente tengo que estar en desacuerdo con la respuesta aceptada. Depende de diferentes navegadores. algunos hacen forEach más rápido, algunos hacen bucles for y otros prueban todos los métodos http://jsben.ch/mW36e

Arr.forEach(a => ( // ... )

y como puedes ver muchos bucles for(a = 0;...) como for(a = 0;...) vale la pena mencionar que sin variables "var" se definirá globalmente y esto puede tener un impacto significativo velocidad, por lo que será lento.

var arr = arr = new Array(11111111).fill(255); var bancos = [ [ "vacío", () =>< l; a++); }] , ["for-loop", () =>(para(var a = 0, l = longitud del arreglo; a< l; ++a) var b = arr[a] + 1; }] , ["for-loop++", () =>(para(var a = 0, l = longitud del arreglo; a< l; a++) var b = arr[a] + 1; }] , ["for-loop - arr.length", () =>(para(var a = 0; a< arr.length; ++a) var b = arr[a] + 1; }] , ["reverse for-loop", () =>( for(var a = arr.length - 1; a >= 0; --a) var b = arr[a] + 1; )] ,[" while-loop ", () => ( var a = 0 , l = longitud del arreglo; while(a< l) { var b = arr[a] + 1; ++a; } }] , ["reverse-do-while-loop", () =>( var a = arr.length - 1; // CUIDADO hacer ( var b = arr[a] + 1; ) while(a--); )] , ["forEach", () => ( arr.forEach( a => ( var b = a + 1; )); )], ["for..in (sólo 3,3%)", () => ( var ar = arr.slice(0,arr.length/33) ; for(const a in ar) ( var b = a + 1; ) )] , ["Dispositivo Duff", () => ( var i = 0; var r = arr.length % 8; var n = (arr .length - r) / 8; si (r > 0) haz ( var b = arr + 1; ) mientras que (--r); si (n > 0) haz ( var b = arr[i] + 1; var c = arr + 1; var d = arr + 1; var e = arr + 1; var f = arr + 1; var g = arr + 1; var h = arr + 1; var k = arr + 1; i = --n >>> 3; ) while (n); )] , ["Dispositivo Duff negativo", () => ( var r = arr.length % 8; var n = (arr.length-r) / 8 ; ///Math.floor(arr.length / 8); var i = arr.length ; // -1; while(r)( var b = arr[--i] + 1; --r; ) while (n)( var b = arr[i] + 1; var c = arr + 1; var d = arr + 1; var e = arr + 1; var f = arr + 1; var g = arr + 1; var h = arreglo + 1; var j = arreglo + 1; i = --n >>> 3; ) )]]; banco de funciones(título, f) ( var t0 = performance.now(); var res = f(); return performance.now() - t0; // console.log("$(título) tomó $(t1-t0 ) msec"); ) var globalVarTime = bench("for-loop sin "var"", () => ( // Aquí, si olvidas poner "var", las variables serán globales for(a = 0, l =arr.longitud;a< l; ++a) var b = arr[a] + 1; }); var times = benches.map(function(a) { arr = new Array(11111111).fill(255); return }).sort((a,b) =>ab); var máx = veces; tiempos = tiempos.map(a => (a = (a/max)*100; devuelve a; )); var plantilla = (título, hora, n) => "" + "$(título) " + " $(Número(hora.toFixed(3)))msec" + ""; var strRes = times.map(t => plantilla(...t)).join("\n") + "

bucle for sin "var" $(globalVarTime) msec."; var $container = document.getElementById("container"); $container.innerHTML = strRes; body ( color:#fff; fondo:#333; font-family :helvetica; ) cuerpo > div > div ( claro: ambos ) cuerpo > div > div > span ( float:izquierda; ancho:43%; margen:3px 0; text-align:right; ) cuerpo > div > div > span :nth-child(2) ( alineación de texto:izquierda; fondo:naranjaoscuro; animación:showup .37s .111s; -webkit-animation:showup .37s .111s; ) @keyframes showup ( de ( ancho:0; ) ) @-webkit-keyframes showup (desde (ancho:0;))

2014 Hace tiempo

Piensa logicamente.

Mira este

For(var índice = 0, longitud = matriz.longitud; índice< length ; index++) { //do stuff }

  • Necesitas crear al menos 2 variables (índice, longitud)
  • Es necesario comprobar si el indicador de longitud es inferior a
  • Es necesario aumentar el índice
  • el bucle for tiene 3 parámetros

Ahora dime por qué esto debería ser más rápido que:

Longitud var = matriz.longitud; while(--longitud) ( //o longitud-- //hacer cosas)

  • una variable
  • Sin cheques
  • El índice disminuye (las máquinas prefieren esto)
  • Mientras que tiene un solo parámetro

Quedé completamente confundido cuando Chrome 28 mostró que el bucle for era más rápido que el tiempo. debería ser algo así como

"Bueno, todo el mundo usa un bucle for, centrémonos en eso cuando para Chrome".

Pero ahora, en 2014, el bucle while volverá a Chrome. es 2 veces más rápido, en otros navegadores antiguos siempre fue más rápido.

Últimamente he hecho algunas pruebas nuevas. Ahora bien, en el mundo real del entorno, estos códigos cortos no tienen valor y jsperf en realidad no puede ejecutar el bucle while correctamente porque necesita recrear array.length, lo que también lleva tiempo.

NO PUEDO obtener la velocidad real del bucle while en jsperf.

necesitas crear tu propia función y verificarla usando window.performance.now()

Y sí... no hay forma de que un bucle while sea más rápido.

El verdadero problema es el tiempo real de manipulación/reproducción/tiempo de dibujo o como quieras llamarlo.

Por ejemplo, tengo una escena de lienzo donde necesito calcular coordenadas y colisiones... esto se hace entre 10 y 200 microsegundos (no milisegundos). en realidad, se necesitan varios milisegundos para hacer todo. Igual que en DOM.

Hay otra manera súper eficiente de usar loop en algunos casos... por ejemplo para copiar/clonar una matriz

For(var i = array.length; i > 0; arrayCopy[ --i ] = array[ i ] // haciendo cosas);

Tenga en cuenta la configuración de los parámetros:

  • Igual que en el bucle while. solo uso una variable
  • Debe verificar si el índice es mayor que 0;
  • Como puede ver, este enfoque es diferente del bucle habitual que todos usan, ya que estoy haciendo cosas dentro del tercer parámetro y también disminuyendo directamente dentro de la matriz.

Se dice que esto confirma que máquinas como

Escribí que pensé en hacerlo un poco más corto y eliminar algunas cosas inútiles y escribí este usando el mismo estilo:

For(var i = array.length; i--; arrayCopy[ i ] = array[ i ] // haciendo cosas);

Incluso si es más corto, parece que usar i una vez más ralentiza todo. Esto es 1/5 más lento que el bucle for y while anterior.

Nota: ; muy importante despues por muuucho sin ()

Incluso si acabo de decirte que jsperf no es la mejor manera de probar scripts. He añadido 2 bucles aquí.

Y aquí hay otra respuesta sobre el rendimiento en javascript.

Esta respuesta debería mostrar formas eficaces de escribir javascript. Entonces, si no puedes leer esto, pregunta y obtendrás una respuesta o lee un libro sobre javascript http://www.ecma-international.org/ecma-262/5.1/

La última revisión de la prueba que preparé (reutilizando una anterior) muestra una cosa.

La longitud del caché no es tan importante, pero no hace daño.

Cada primera ejecución de la prueba vinculada anteriormente (en la pestaña recién abierta) brinda los mejores resultados para los últimos 4 fragmentos (3.º, 5.º, 7.º y 10.º en los gráficos) en Chrome, Opera y Firefox en mi Debian Squeeze de 64 bits ( mi hardware de escritorio). Las ejecuciones posteriores dan un resultado completamente diferente.

Las conclusiones sobre el rendimiento son simples:

  • Vaya a un bucle for (adelante) y verifique con! == en su lugar< .
  • Si no necesita reutilizar la matriz más adelante, entonces un bucle con longitud reducida y cambio de matriz destructivo () también es efectivo.

Actualmente (2011.10), la siguiente plantilla parece ser la más rápida.

Para (var i = 0, len = arr.length; i !== len; i++) ( ... )

Recuerde que el almacenamiento en caché de arr.length no es crítico aquí, por lo que puede simplemente probar i !== arr.length y no habrá ningún impacto en el rendimiento, pero obtendrá un código más corto.

PD: Sé que en un fragmento con shift() se puede usar su resultado en lugar de acceder al elemento 0, pero de alguna manera lo pasé por alto después de reutilizar la revisión anterior (que tenía el valor incorrecto durante los bucles), y luego no quise perder los resultados ya obtenidos.

¿“Mejor” como en puro rendimiento? o rendimiento Y?

El "mejor" rendimiento puro es aquel que utiliza el caché y el operador de prefijo ++ (mis datos: http://jsperf.com/caching-array-length/189)

Para (var i = 0, len = myArray.length; i< len; ++i) { // blah blah }

Yo diría que un bucle sin caché es el mejor equilibrio entre el tiempo de ejecución y el tiempo de lectura del programador. Todo programador que comience con C/C++/Java no gastará ms en leer esto.

Para(var i=0; i< arr.length; i++){ // blah blah }

** almacena en caché la longitud de la matriz dentro del bucle, algunos segundos de tiempo se perderán. Depende de los elementos del array, si hay más elementos en el array hay una gran diferencia respecto al tiempo*

SArri; //Formación; para(var i = 0 ; i = 0) ( hacerAlgo(matriz[i]); )

Si el orden de prioridad es importante, utilice este enfoque.

Sea ii = matriz.longitud; sea ​​yo = 0; mientras yo< ii) { doSomething(array[i]); ++i; }

Siempre escribo en el primer estilo.

Incluso si el compilador es lo suficientemente inteligente como para optimizarlo para matrices, ¿sigue siendo inteligente si usamos DOMNodeList aquí o algún objeto complejo con longitud calculada?

Sé que la pregunta es sobre matrices, pero creo que es una buena práctica escribir todos los bucles con el mismo estilo.

Vararr = ; // La matriz var i = 0; mientras yo< arr.length) { // Do something with arr[i] i++; }

i++ es más rápido que ++i, --i y i -

¡Hola! En la última lección, vimos qué son los objetos y por qué son necesarios, y hoy veremos cómo trabajar con las propiedades de un objeto y cómo clasificar todas estas propiedades. Para estos fines, se utiliza un bucle de propiedad for..in (puede leer sobre bucles en JavaScript).

Bucle para...en

Sintaxis:

Para (teclee obj) ( /* ... acciones con obj ... */ )

El bucle for..in iterará secuencialmente a través de las propiedades del objeto obj, escribiendo el nombre de cada propiedad en la clave.

Declarar una variable en un bucle for (clave var en obj)

En este bucle puedes declarar la variable clave:

Para (tecla var en menú1) ( // ... )

Veamos un ejemplo de iteración a través de las propiedades de un objeto usando un bucle for...in:

Menú Var = (ancho: 400, alto: 300, título: "Menú Mi"); for (clave var en el menú) ( // este código funcionará para cada propiedad del objeto // ..y mostrará el nombre de la propiedad y su valor en consecuencia alert("Clave: " + clave + " valor: " + menú) ; )

Me gustaría llamar su atención sobre el hecho de que en el ejemplo utilizamos el menú entre corchetes. Esto se debe a que si almacenamos el nombre de una propiedad en una variable, entonces solo podremos acceder a ella entre corchetes, pero no mediante un punto.

Bucle para... de

También hay un nuevo bucle para atravesar objetos y matrices. Su sintaxis es muy similar a la del bucle for...in, pero la diferencia es que no genera las claves o índices de la matriz, sino sus valores. He aquí un ejemplo:

Menú Var = (ancho: 400, alto: 300, título: "Menú Mi"); for (clave var del menú) ( // este código funcionará para cada propiedad del objeto // ..y mostrará el valor de la propiedad en consecuencia alert("valor: " + tecla +","); //400, 300, "Menú Mi")

Número de propiedades en un objeto

Pero, ¿qué pasa si necesita saber la cantidad de propiedades de un objeto? ¿Cómo puedo hacer eso?

Desafortunadamente, no existen soluciones preparadas para este problema.

La forma más sencilla es recorrer las propiedades y calcular de la siguiente manera:

Menú Var = (ancho: 400, alto: 300, título: "Menú Mi"); recuento de variables = 0; for (tecla var en el menú) (count++; ) alert("Propiedades totales: " + count);

Resultados
  • Para iterar a través de las propiedades de un objeto, se utiliza un bucle de clave: for (teclee obj).
Tareas Determinar si un objeto está vacío

Cree una función isEmptyObject(obj) que devuelva verdadero si el objeto no tiene propiedades y falso si hay al menos una propiedad.

Debería funcionar así:

La función esEmptyObject(obj) ( /* tu código */ ) var obj = (); alerta(isEmptyObject(obj)); // verdadero obj["8:30"] = "subir"; alerta(isEmptyObject(obj)); // FALSO

Calcular la media aritmética de todas las propiedades del objeto.

Hay un objeto de salario con salarios. Escriba un código que muestre el promedio aritmético de todos los salarios.
Si el objeto está vacío, entonces el resultado debería ser 0.
Por ejemplo.

¡Hola! Continuamos estudiando métodos de matriz y en esta lección veremos métodos para iterar sobre una matriz. Estos métodos le permiten recorrer una matriz y realizar ciertas acciones en sus elementos. Sí, olvidé decir que todos estos métodos no son compatibles con IE 8. Aunque es muy importante ahora que no son compatibles con este navegador, aún así, si desea compatibilidad con IE8, ES5-shim lo ayudará. Y continuaremos

para cada método

Este método se utiliza para recorrer una matriz en un bucle, pero puedes pasarle una función en la que puedes realizar ciertas acciones sobre los elementos de la matriz. Veamos un ejemplo.

Var mas = ["Plátano", "Aguacate", "Zanahoria"]; mas.forEach(function(item, i, mas) ( alert(i + ": " + item + " (matriz: " + mas + ")"); ));

Aquí en el ejemplo, se pasa una función al método forEach, que especifica 3 parámetros:

elemento - elemento de matriz

i - número de elemento de la matriz

mas es la matriz que se está procesando.

Este método se puede utilizar en lugar de un bucle for para iterar a través de una matriz.

método de filtrado

Este método, al igual que el método forEach, se utiliza para iterar a través de una matriz y se le pasa una función como argumento, pero le permite filtrar la matriz y devuelve una nueva matriz, que contiene solo aquellos elementos para los cuales la función que pasamos a este método devolverá verdadero.

Es un poco confuso, así que veámoslo con un ejemplo.

Var más = ; var númeroPositivo = mas.filter(función(núm) (retorna número > 0;)); documento.write(númeropositivo); // 1,4,3

En el ejemplo hay una matriz con números y necesitamos obtener otra matriz que contenga solo números positivos de la matriz original. Para hacer esto, aplicamos el método de filtro a la matriz y llamamos a una función que verificará cada elemento, es decir, devolverá todos los números positivos y el resultado se almacenará en otra matriz, en el ejemplo es PositiveNum.

método de mapa

El método map crea otra matriz, que consistirá en los resultados de llamar a la función de la matriz original, pero en esta función se llevarán a cabo algunas acciones en los elementos de la matriz original y el resultado aparecerá en la nueva matriz tal como está. Veamos un ejemplo; de lo contrario, creo que no está del todo claro.

Var más = ; var newMas = mas.map(función(elemento) ( devolver elemento*elemento; )); // obtuve una matriz con cuadrados alert(newMas); // 1,4,9

En el ejemplo, hay un arreglo inicial con números, se le aplica el método map, en el cual cada elemento del arreglo se multiplica por sí mismo y el resultado se escribe en otro arreglo. Como resultado, obtenemos una matriz con los cuadrados de los números en la matriz original.

Métodos todos/algunos

Estos métodos verifican si un elemento está presente en la matriz. Lo hacen a través de una función que se les pasa como parámetro, es decir, si esta función devuelve verdadero, entonces el método en sí devolverá verdadero. Además, el método each requiere que cada elemento cumpla la condición de la función, y el método some requiere que al menos uno coincida. Y como siempre, aquí tienes un ejemplo.

Var más = ; función isPositiv(num) ( return num > 0; ) if(mas.every(isPositiv)) ( document.write("La matriz contiene solo números positivos"); ) else( document.write("La matriz contiene al menos uno número negativo "); ) if(mas.some(isPositiv)) ( document.write("La matriz contiene al menos un número positivo"); ) else ( document.write("No hay números positivos en la matriz") ; )

Considere un ejemplo: tenemos una matriz con números positivos y negativos y necesitamos verificar la presencia de al menos un número negativo. Para hacer esto, utilizamos todos y algunos métodos. Creamos una función que devolverá números positivos y luego la pasaremos al método each. Dado que este método devuelve un resultado lógico, se utiliza en declaraciones condicionales. El método each en nuestro ejemplo devolverá falso porque hay números negativos en la matriz, pero el método some devolverá verdadero porque hay al menos un número positivo en la matriz.

reducir/reducirDerecha

Si necesita iterar a través de una matriz, puede usar forEach, for o for...of.

Si necesita iterar a través de una matriz y devolver datos para cada elemento, utilice map.

Los métodos arr.reduce y arr.reduceRight son similares a los métodos anteriores, pero son un poco más complejos. Se utilizan para calcular un valor único basado en toda la matriz.

Sintaxis:

Let valor = arr.reduce(function(valoranterior, elemento, índice, matriz) ( // ... ), );

La función se aplica a su vez a todos los elementos de la matriz y "transfiere" su resultado a la siguiente llamada.

Argumentos:

  • valor anterior: el resultado de la llamada anterior de esta función, igual a inicial en la primera llamada (si se pasa inicial),
  • elemento: el siguiente elemento de la matriz,
  • índice – su índice,
  • matriz: la matriz en sí.

Cuando se llama a una función, el resultado de su llamada al elemento anterior de la matriz se pasa como primer argumento.

Esto suena complicado, pero se vuelve más simple si piensa que el primer argumento "acumula" el resultado de llamadas a funciones anteriores. Cuando termine, se convierte en el resultado de reducir.

Este método es más fácil de entender, como siempre, con un ejemplo.

Aquí obtenemos la suma de todos los elementos de la matriz en una sola línea:

Sea arr = ; let resultado = arr.reduce((suma, actual) => suma + actual, 0); alerta(resultado); // 15

Aquí usamos la opción de reducción más común, que usa solo 2 argumentos.

Echemos un vistazo más de cerca a cómo funciona.

  • En la primera ejecución, la suma es inicial (el último argumento de reducir), que es 0, y la actual es el primer elemento de la matriz, que es 1. Por lo tanto, el resultado de la función es 1.
  • La segunda vez que ejecutamos suma = 1, le agregamos el segundo elemento de la matriz (2).
  • En la tercera ejecución, suma = 3, a lo que agregamos el siguiente elemento, y así sucesivamente...
  • El flujo de cálculo se ve así:

    En forma de tabla, donde cada línea es una llamada de función en el siguiente elemento de la matriz:

    suma del resultado actual
    primera llamada 1 1
    segunda llamada 1 2 3
    tercer desafío 3 3 6
    cuarto desafío 6 4 10
    quinto desafío 10 5 15

    Aquí puedes ver claramente cómo el resultado de la llamada anterior se pasa al primer argumento de la siguiente.

    También podemos omitir el valor inicial:

    Sea arr = ; // se elimina el valor inicial (no hay 0 al final) let result = arr.reduce((sum, current) => sum + current); alerta(resultado); // 15

    ¡El resultado es exactamente el mismo! Esto se debe a que, en ausencia de inicial, el primer elemento de la matriz se toma como el primer valor y la búsqueda comienza desde el segundo.

    La tabla de cálculo será la misma menos la primera línea.

    Pero tal uso requiere extrema precaución. Si la matriz está vacía, llamar a reducir sin un valor inicial generará un error.

    He aquí un ejemplo:

    Sea arr = ; // Error: Reducción de una matriz vacía sin valor inicial // si hubiera un valor inicial, reducir lo devolvería para una matriz vacía. arr.reduce((suma, actual) => suma + actual);

    Resultados

    Entonces, para resumir, vimos varios métodos para trabajar con matrices en un bucle. Todos estos métodos tienen una cosa en común: todos necesitan pasar una función como argumento.

    • forEach: para recorrer una matriz.
    • filtrar: para filtrar la matriz. Devuelve una nueva matriz filtrada
    • cada/algunos: para verificar la presencia de elementos individuales en la matriz.
    • mapa: para convertir una matriz en una matriz. Devuelve la matriz convertida original.
    • reduce/reduceRight: calcula un valor de toda la matriz, llama a una función en cada elemento y pasa el resultado intermedio entre llamadas. Se puede utilizar para calcular la suma de los elementos de la matriz.
    Tareas Obtener una nueva matriz

    Deje que se proporcione la matriz var mas = ["HTML", "CSS", "JavaScript", "Pascal"], debe usar el método map para obtener una nueva matriz que contendrá las longitudes de cada elemento de la matriz original. .

    Filtrar la matriz

    Hay una matriz var mas = necesitas usar el método de filtro para obtener una matriz que contenga solo números positivos.

    Comprobar matriz

    Hay una matriz var mas = debe verificar si hay números negativos en la matriz y mostrar el resultado en la pantalla.

    Bueno, en conclusión, un breve vídeo sobre métodos para recorrer una matriz.

    • Traducción
    • I. Iterando sobre matrices reales
    • para cada método y métodos relacionados
    • en bucle
    • Uso adecuado del bucle for...in
    • for...of loop (uso implícito de iterador)
    • Uso explícito de iterador.
    • Usar métodos para iterar sobre matrices reales
    • Convertir a una matriz real
    • Una nota sobre los objetos en tiempo de ejecución
    I. Iterar sobre matrices reales Por el momento, existen tres formas de iterar sobre los elementos de una matriz real:
  • método Array.prototype.forEach;
  • clásico para bucle
  • un bucle for...in construido “correctamente”.
  • Además, pronto, con la llegada del nuevo estándar ECMAScript 6 (ES 6), se esperan dos métodos más:
  • for...of loop (uso implícito de iterador);
  • uso explícito de iterador.
  • 1. El método forEach y métodos relacionados Si su proyecto está diseñado para admitir las características del estándar ECMAScript 5 (ES5), puede utilizar una de sus innovaciones: el método forEach.

    Ejemplo de uso:
    var a = ["a", "b", "c"]; a.forEach(función(entrada) (consola.log(entrada); ));
    En general, usar forEach requiere conectar la biblioteca de emulación es5-shim para navegadores que no admiten este método de forma nativa. Estos incluyen IE 8 y versiones anteriores, que todavía se utilizan en algunos lugares.

    La ventaja de forEach es que no es necesario declarar variables locales para almacenar el índice y el valor del elemento de la matriz actual, ya que se pasan automáticamente a la función de devolución de llamada como argumentos.

    Si te preocupa el posible coste de realizar una devolución de llamada para cada elemento, no te preocupes y lee esto.

    ForEach está diseñado para iterar sobre todos los elementos de una matriz, pero además, ES5 ofrece varios métodos más útiles para iterar sobre todos o algunos elementos, además de realizar algunas acciones sobre ellos:

    • each-devuelve verdadero si para cada elemento de la matriz la devolución de llamada devuelve un valor que se puede convertir a verdadero.
    • some: devuelve verdadero si para al menos un elemento de la matriz la devolución de llamada devuelve un valor que se puede convertir a verdadero.
    • filtro: crea una nueva matriz que incluye aquellos elementos de la matriz original para los cuales la devolución de llamada devuelve verdadero.
    • mapa: crea una nueva matriz que consta de los valores devueltos por la devolución de llamada.
    • reducir: reduce una matriz a un solo valor, aplicando una devolución de llamada a cada elemento de la matriz por turno, comenzando con el primero (puede ser útil para calcular la suma de los elementos de la matriz y otras funciones de resumen).
    • reduceRight: funciona de manera similar a reducir, pero itera a través de los elementos en orden inverso.
    2. Para bucle Bueno viejo para las reglas.:

    Var a = ["a", "b", "c"]; índice var; para (índice = 0; índice< a.length; ++index) { console.log(a); }
    Si la longitud de la matriz es constante a lo largo del bucle y el bucle en sí pertenece a una sección de código crítica para el rendimiento (lo cual es poco probable), entonces puede usar una versión "más óptima" de for que almacene la longitud de la matriz. :

    Var a = ["a", "b", "c"]; índice var, len; para (índice = 0, len = a.length; índice< len; ++index) { console.log(a); }
    En teoría, este código debería ejecutarse un poco más rápido que el anterior.

    Si el orden de los elementos no es importante, entonces puedes ir aún más lejos en términos de optimización y deshacerte de la variable para almacenar la longitud de la matriz, cambiando el orden de búsqueda al revés:

    Var a = ["a", "b", "c"]; índice var; para (índice = a.length - 1; índice >= 0; --index) ( console.log(a); )
    Sin embargo, en los motores JavaScript modernos, estos juegos de optimización no suelen significar nada.

    3. Uso adecuado de un bucle for...in Si se le recomienda utilizar un bucle for...in, recuerde que iterar sobre matrices no es para lo que está diseñado. Contrariamente a una idea errónea común, el bucle for...in no itera sobre índices de matrices, sino a través de propiedades enumerables de un objeto.

    Sin embargo, en algunos casos, como en la iteración sobre matrices dispersas, for...in puede ser útil, siempre y cuando se tomen precauciones, como se muestra en el siguiente ejemplo:

    // a - matriz dispersa var a = ; a = "a"; a = "b"; a = "c"; for (var clave en a) (if (a.hasOwnProperty(clave) && /^0$|^\d*$/.test(clave) && clave

    ¿Te gustó el artículo? Compártelo