mozilla
Los resultados de tu búsqueda

    Array.prototype.forEach()

    Este articulo necesita una revisión editorial.

    This translation is incomplete. Please help translate this article from English.

    Resumen

    Ejecuta determinada función una vez por cada elemento del arreglo.

    Sintaxis

    array.forEach(callback[, thisArg])

    Parámetros

    callback
    Función a ejecutar para cada elemento, que recibe tres argumentos:
    currentValue
    El elemento siendo procesado en el array.
    index
    El índice del elemento siendo procesado en el array.
    array
    El array sobre el cual forEach() fue llamado.
    thisArg
    Opcional. Valor que se usará como this al ejecutar callback.

    Descripción

    forEach() ejecuta la función callback una vez por cada elemento del arreglo en orden ascendente. No es invocada para índices que han sido eliminados. Sin embargo, sí se ejecutará para elementos del array cuyo valor sea undefined.

    callback es invocada con tres argumentos:

    • el elemento value
    • el elemento index
    • el array que es recorrido

    Si un parámetro thisArg es proporcionado a forEach, será usado como el valor this para cada invocación de callback como si callback.call(thisArg, element, index, array) fuera llamado. Si thisArg es undefined o null, el valor this dentro de la función depende si la función está o no en modo estricto (valor pasado si está en modo estricto, objeto global si está en modo no-estricto).

    El rango de elementos procesados por forEach se establece antes de la primera invocación de callback. Los elementos que sean añadidos al arreglo después de que inicie la llamada a forEach no serán afectados por callback. Si los valores de los elementos existentes en el array son modificados, el valor enviado al callback será el valor al momento de que forEach los visite; no se evaluarán los elementos que fueran borrados antes de ser visitados por forEach.

    Nota : No hay forma de detener o cortar un bucle forEach. La solución es utilizar Array.everyArray.some. Ver ejemplos debajo.

    Ejemplos

    Ejemplo: Imprimiendo el contenido de un array

    El siguiente código imprime una línea por cada elemento en un array:

    function logArrayElements(element, index, array) {
        console.log("a[" + index + "] = " + element);
    }
    [2, 5, 9].forEach(logArrayElements);
    // logs:
    // a[0] = 2
    // a[1] = 5
    // a[2] = 9
    

    Example: Interrumpiendo un bucle forEach

    El siguiente código imprime el contenido de un array y se detiene cuando encuentra un valor mayor que el UMBRAL dado.

    var UMBRAL = 12;
    var v = [5, 2, 16, 4, 3, 18, 20];
    var res;
    
    res = v.every(function(element, index, array) {
        console.log("element:", element);
        if (element >= UMBRAL) {
            return false;
        }
    
        return true;
    });
    console.log("res:", res);
    // logs:
    // element: 5
    // element: 2
    // element: 16
    // res: false
    
    res = v.some(function(element, index, array) {
        console.log("element:", element);
        if (element >= UMBRAL) {
            return true;
        }
    
        return false;
    });
    console.log("res:", res);
    // logs:
    // element: 5
    // element: 2
    // element: 16
    // res: true
    

    Ejemplo: Copiar un objeto

    El siguiente código crea una copia de un objeto dato. Hay diferentes formas de crear una copia de un objeto, ésta es sólo una de ellas y sirve para explicar cómo funciona el Array.prototype.forEach utilizando funciones Object.* del ECMAScript 5.

    function copy(o){
      var copy = Object.create( Object.getPrototypeOf(o) );
      var propNames = Object.getOwnPropertyNames(o);
    
      propNames.forEach(function(name){
        var desc = Object.getOwnPropertyDescriptor(o, name);
        Object.defineProperty(copy, name, desc);
      });
    
      return copy;
    }
    
    var o1 = {a:1, b:2};
    var o2 = copy(o1); // o2 looks like o1 now
    

    Compatibilidad con navegadores 

    forEach se agregó de manera reciente al estándar ECMA-262; asi que puede no estar presente en otras implementaciones del estándar. Se puede asegurar el uso del forEach con tan solo agregar el siguiente código al inicio de los scripts, permitiendo así el uso de forEach en implementaciones que no lo soportan de manera nativa. El algoritmo es el mismo que se especifica en la quinta versión de ECMA-262, asumiendo que Object y TypeError tienen sus valores originales y que callback.call evalua el valor original de Function.prototype.call().

    // Production steps of ECMA-262, Edition 5, 15.4.4.18
    // Reference: http://es5.github.com/#x15.4.4.18
    if (!Array.prototype.forEach) {
    
      Array.prototype.forEach = function forEach(callback, thisArg) {
        'use strict';
        var T, k;
    
        if (this == null) {
          throw new TypeError("this is null or not defined");
        }
    
        var kValue,
            // 1. Let O be the result of calling ToObject passing the |this| value as the argument.
            O = Object(this),
    
            // 2. Let lenValue be the result of calling the Get internal method of O with the argument "length".
            // 3. Let len be ToUint32(lenValue).
            len = O.length >>> 0; // Hack to convert O.length to a UInt32
    
        // 4. If IsCallable(callback) is false, throw a TypeError exception.
        // See: http://es5.github.com/#x9.11
        if ({}.toString.call(callback) !== "[object Function]") {
          throw new TypeError(callback + " is not a function");
        }
    
        // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
        if (arguments.length >= 2) {
          T = thisArg;
        }
    
        // 6. Let k be 0
        k = 0;
    
        // 7. Repeat, while k < len
        while (k < len) {
    
          // a. Let Pk be ToString(k).
          //   This is implicit for LHS operands of the in operator
          // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk.
          //   This step can be combined with c
          // c. If kPresent is true, then
          if (k in O) {
    
            // i. Let kValue be the result of calling the Get internal method of O with argument Pk.
            kValue = O[k];
    
            // ii. Call the Call internal method of callback with T as the this value and
            // argument list containing kValue, k, and O.
            callback.call(T, kValue, k, O);
          }
          // d. Increase k by 1.
          k++;
        }
        // 8. return undefined
      };
    }
    
    

    Browser compatibility

    Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
    Basic support (Yes) 1.5 9 (Yes) (Yes)
    Feature Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
    Basic support ? ? ? ? ?

     

    Vea También

    Etiquetas y colaboradores del documento

    Contributors to this page: everblut, fernandomg, elfoxero, teoli
    Última actualización por: everblut,
    Ocultar la barra lateral