ejemplo:

var arr = ["one","two","three"];

arr.forEach(function(part){
  part = "four";
  return "four";
})

alert(arr);

La matriz siguen con sus valores originales, hay alguna manera de tener acceso de escritura a los elementos del conjunto a partir de la iteración de una función ?

InformationsquelleAutor rsk82 | 2012-09-18

9 Comentarios

  1. 396

    La devolución de llamada se pasa el elemento, el índice, y la propia matriz.

    arr.forEach(function(part, index, theArray) {
      theArray[index] = "hello world";
    });

    editar — como se señaló en un comentario, el .forEach() función puede tomar un segundo argumento, el cual será utilizado como el valor de this en cada llamada a la devolución de llamada:

    arr.forEach(function(part, index) {
      this[index] = "hello world";
    }, arr); //use arr as this

    Que el segundo ejemplo muestra arr sí se configura como this en la devolución de llamada. Uno podría pensar que la matriz de involucrados en el .forEach() llamada podría ser el defecto valor de this, pero por alguna razón no; this será undefined si el segundo argumento es que no siempre.

    También es importante recordar que hay toda una familia de similar utilidades que se incluyen en la Matriz de prototipo, y muchas preguntas pop-up en Stackoverflow acerca de una función u otro, que la mejor solución es simplemente la selección de una herramienta diferente. Tienes:

    • forEach para hacer una cosa o para cada entrada en una matriz;
    • filter para la producción de una nueva matriz que contiene sólo los participantes;
    • map para hacer un uno-a-uno de la nueva matriz, mediante la transformación de una matriz existente;
    • some para comprobar si al menos un elemento en una matriz sirve para algunos de descripción;
    • every para comprobar si todos las entradas de una matriz coincide una descripción;
    • find para buscar un valor en una matriz

    y así sucesivamente. MDN enlace

    • Gracias! ES6: arr.forEach((o, i, a) => a[i] = myNewVal)
    • por qué part (o incluso o en es6) es indefinido ? cómo llegar a afirmar valor?
    • sería undefined si un elemento de la matriz se ha asignado undefined explícitamente. «Vacío» ranuras de una matriz (matriz de entrada que nunca se ha asignado ningún valor) se omiten por .forEach() y la mayoría de los otros de la matriz de iteración métodos.
    • La integridad, la .forEach() también toma un segundo argumento thisArg, que se puede utilizar como this en el interior de la devolución de llamada. NOTA: este un argumento de .forEach NO es un argumento de la devolución de llamada.
    • El uso de la this que se pasa como segundo argumento a .forEach(), usted necesita para pasar a la función de devolución de llamada utilizando la sintaxis function(), ya que el uso de ES6 la flecha de la función () => {} no se unen contexto.
  2. 120

    Vamos a intentar para mantenerlo simple y discutir cómo funciona en realidad. Tiene que ver con los tipos de variables y parámetros de la función.

    Aquí está el código que estamos hablando:

    var arr = ["one","two","three"];
    
    arr.forEach(function(part) {
      part = "four";
      return "four";
    })
    
    alert(arr);

    Primero, aquí es donde debes estar leyendo acerca de la Matriz.el prototipo.forEach():

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

    Segundo, vamos a hablar brevemente acerca de los tipos de valor en JavaScript.

    Primitivas (undefined, null, String, Boolean, Number) almacenar un valor real.

    ex: var x = 5;

    Los Tipos de referencia (objetos personalizados) guardar la ubicación de memoria del objeto.

    ex: var xObj = { x : 5 };

    Y tercero, cómo los parámetros de la función de trabajo.

    A las funciones, los parámetros son siempre pasan por valor.

    Porque arr es un array de Cadenas de caracteres, es una matriz de primitivo objetos, lo que significa que son almacenados por valor.

    Así que para el código anterior, esto significa que cada vez que el forEach() recorre, part es igual a la misma valor como arr[index], pero no el objeto mismo.

    part = "four"; va a cambiar la part variable, pero dejará arr solo.

    El siguiente código va a cambiar los valores que deseo:

    var arr = ["one","two","three"];
    
    arr.forEach(function(part, index) {
      arr[index] = "four";
    });
    
    alert(arr);

    Ahora bien, si la matriz de arr fue una matriz de los tipos de referencia, el siguiente código de trabajo porque hace referencia a los tipos de almacén de una ubicación de memoria de un objeto en lugar del objeto real.

    var arr = [{ num : "one" }, { num : "two"}, { num : "three"}];
    
    arr.forEach(function(part, index) {
      //part and arr[index] point to the same object
      //so changing the object that part points to changes the object that arr[index] points to
    
      part.num = "four";
    });
    
    alert(arr[0].num);
    alert(arr[1].num);
    alert(arr[2].num);

    La siguiente ilustra el hecho de que usted puede cambiar part a punto para un nuevo objeto, dejando los objetos almacenados en arr solo:

    var arr = [{ num : "one" }, { num : "two"}, { num : "three"}];
    
    arr.forEach(function(part, index) {
      //the following will not change the object that arr[index] points to because part now points at a new object
      part = 5;
    });
    
    alert(arr[0].num);
    alert(arr[1].num);
    alert(arr[2].num);
    • de hecho, gran explicación! Habría sido aún mejor para ampliar la explicación a los otros métodos de iteración, para…de, mapa, … El nuevo de…de las obras de una manera muy similar de forEach para tales casos, salvo que el «índice» que falta para modificar eventualmente la matriz original (como en el forEach). También ES5 mapa se parece a un forEach, tal vez sólo que la posibilidad de devolver los valores a partir de un mapa que hace las cosas más claras a partir de una sintaxis de la perspectiva de utilizar el índice.
    • Gran explicación. Gracias. Después de todo lo que no pueden obtener esta declaración: In functions, parameters are always passed by value. Lo que sobre el segundo ejemplo?
    • Esa declaración está describiendo los parámetros de la función siempre se pasan por valor. Así que para los primitivos, será el valor que el primitivo puntos. Para los objetos, va a ser la ubicación en la que el objeto está señalando. esta w3schools página tiene una buena explicación. Consulte las secciones de la los Argumentos se Pasan por Valor de y Objetos se Pasan por Referencia.
    • En funciones, los parámetros se pasan siempre por valor. BAM. thx. +1
  3. 79

    Matriz: [1, 2, 3, 4]

    Resultado: ["foo1", "foo2", "foo3", "foo4"]

    Array.el prototipo.mapa() Mantener la matriz original

    JS:

    const originalArr = ["Iron", "Super", "Ant", "Aqua"];
    const modifiedArr = originalArr.map(name => `${name}man`);
    
    console.log( "Original: %s", originalArr );
    console.log( "Modified: %s", modifiedArr );

    Array.el prototipo.forEach() Anular de la matriz original

    JS:

    const originalArr = ["Iron", "Super", "Ant", "Aqua"];
    originalArr.forEach((name, index) => originalArr[index] = `${name}man`);
    
    console.log( "Overridden: %s", originalArr );

    • «De la matriz.el prototipo.mapa() Modificar la matriz original, lograda mediante la reasignación de arr variable» .mapa() nunca modifica la matriz original, se crea una nueva. La reasignación de que la variable no cambia el objeto original.
    • let arr1 = ["1", 2, 3, 4]; arr1.map(function(v) { return "foo"+ v; }); console.log( arr ); Matriz.el prototipo.mapa() Nunca Modificar la matriz original, forEach mutar.
    • Eso no es cierto en absoluto. map sin duda puede mutar su matriz y forEach, en general, no.
    • gracias por la respuesta. Todo lo que quiero agregar, forEach reemplaza los datos, pero un mapa, no se puede, se crea una nueva copia.
  4. 13

    Javascript se pasa por valor, y que en esencia significa part es un copia de el valor de la matriz.

    Para cambiar el valor, acceso a la matriz a sí misma en su bucle.

    arr[index] = 'new value';

    • Depende del tipo de part si es copiado – aunque tienes razón en que la variable no es un puntero, pero un valor
    • Diciendo «JavaScript se pasa por valor» es una burda generalización. Hay tipos de referencia en JavaScript. Los tipos de valor que se pasan por valor.
    • No una burda generalización. Totalmente correcta y declaración absoluta. Javascript pasa referencias por valor. Javascript se pasa por valor, siempre.
    • Yo no era consciente de eso. Tendría alguna enlaces que explica por favor?
    • href=»http://stackoverflow.com/a/518069/305644″>stackoverflow.com/a/518069/305644
    • No, no importa el tipo. Todos los valores se copian en la asignación, el único valores en JavaScript son primitivas y referencias. Ambos tipos primitivos y referencias se copian en la asignación.
    • OK, pero supongo que no todo el mundo estaría de considerar las referencias a los valores 🙂
    • sólo porque el lenguaje tiene una cosa que se llama una referencia, no significa que no se utiliza el paso por referencia. Las referencias pueden ser (y son) se pasan por valor, es decir, el valor de la referencia se copia y que la copia se utiliza como argumento.

  5. 3

    El .forEach función puede tener una función de devolución de llamada(eachelement, elementIndex)
    Así que básicamente lo que tienes que hacer es :

    arr.forEach(function(element,index){
        arr[index] = "four";   //set the value  
    });
    console.log(arr); //the array has been overwritten.

    O si desea mantener la matriz original, usted puede hacer una copia de la misma antes de realizar el proceso anterior.
    Para hacer una copia, usted puede utilizar:

    var copy = arr.slice();
    • Si usted desea hacer una copia de la matriz, uso map() en lugar de forEach(). map() itera a través de la matriz de origen y devuelve una nueva matriz que contiene el [modificado] copia de la original: el origen de la matriz se deja sin cambios.
  6. 2

    reemplazarlo con el índice de la matriz.

    array[index] = new_value;
    • Genial … Siempre añadir alguna explicación
  7. 2

    Aquí una similar respuesta mediante el uso de un => función de estilo:

    var data = [1,2,3,4];
    data.forEach( (item, i, self) => self[i] = item + 10 );

    da el resultado:

    [11,12,13,14]

    La self parámetro no es estrictamente necesario, con la flecha de estilo de función, por lo que

    data.forEach( (item,i) => data[i] = item + 10);

    también funciona.

  8. 1

    Con el objeto de Matriz de métodos puede modificar el contenido de la Matriz sin embargo, en comparación con el básico para los bucles, estos métodos carecen de una funcionalidad importante. Usted no puede modificar el índice de la carrera.

    Por ejemplo, si va a quitar el elemento actual y lugar a otro de índice de posición dentro de la misma matriz que usted puede hacer esto fácilmente. Si mueve el elemento actual a una posición anterior, no hay problema, en la siguiente iteración obtendrá el mismo elemento siguiente como si no hubiera hecho nada.

    Considerar este código donde nos tenemos que mover el elemento en la posición de índice de la 5 a la posición de índice 2 una vez que el índice de la cuenta hasta 5.

    var ar = [0,1,2,3,4,5,6,7,8,9];
    ar.forEach((e,i,a) => {
    i == 5 && a.splice(2,0,a.splice(i,1)[0])
    console.log(i,e);
    }); //0 0 - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 6 - 7 7 - 8 8 - 9 9

    Sin embargo, si nos tenemos que mover el elemento actual en algún lugar más allá de la actual posición de índice, las cosas se ponen un poco desordenado. A continuación, el siguiente elemento se desplazará en la trasladaron elementos de la posición y en la siguiente iteración no vamos a ser capaces de ver o evaluar.

    Considerar este código donde nos tenemos que mover el elemento en la posición de índice de la 5 a la posición de índice 7 una vez que el índice de la cuenta hasta 5.

    var a = [0,1,2,3,4,5,6,7,8,9];
    a.forEach((e,i,a) => {
    i == 5 && a.splice(7,0,a.splice(i,1)[0])
    console.log(i,e);
    }); //0 0 - 1 1 - 2 2 - 3 3 - 4 4 - 5 5 - 6 7 - 7 5 - 8 8 - 9 9

    Así que nunca hemos conocido a 6 en el bucle. Normalmente en un bucle for que se espera disminuir el índice de valor cuando se mueve el elemento de matriz hacia adelante, de modo que el índice se mantiene en la misma posición en la carrera siguiente y todavía se puede evaluar el elemento desplazado hacia el elemento eliminado del lugar. Esto no es posible con la matriz de métodos. Usted no puede alterar el índice. Verificación del siguiente código

    var a = [0,1,2,3,4,5,6,7,8,9];
    a.forEach((e,i,a) => {
    i == 5 && (a.splice(7,0,a.splice(i,1)[0]), i--);
    console.log(i,e);
    }); //0 0 - 1 1 - 2 2 - 3 3 - 4 4 - 4 5 - 6 7 - 7 5 - 8 8 - 9 9

    Como se puede ver cuando nos decremento i que no se siguen de 5 y 6, a partir de donde lo dejó.

    Así que tenga esto en mente.

  9. 0

    Para añadir o eliminar elementos totalmente susceptibles de alterar el índice, a modo de extensión de zhujy_8833 sugerencia de slice() para recorrer a través de una copia, simplemente contar el número de elementos que ya han eliminado o añadido y alterar el índice en consecuencia. Por ejemplo, para eliminar elementos:

    let values = ["A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8"];
    let count = 0;
    values.slice().forEach((value, index) => {
        if (value === "A2" || value === "A5") {
            values.splice(index - count++, 1);
        };
    });
    console.log(values);
    
    //Expected: [ 'A0', 'A1', 'A3', 'A4', 'A6', 'A7', 'A8' ]

    Para insertar elementos antes:

    if (value === "A0" || value === "A6" || value === "A8") {
        values.splice(index - count--, 0, 'newVal');
    };
    
    //Expected: ['newVal', A0, 'A1', 'A2', 'A3', 'A4', 'A5', 'newVal', 'A6', 'A7', 'newVal', 'A8' ]

    Para insertar elementos después de:

    if (value === "A0" || value === "A6" || value === "A8") {
        values.splice(index - --count, 0, 'newVal');
    };
    
    //Expected: ['A0', 'newVal', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'newVal', 'A7', 'A8', 'newVal']

    Para reemplazar un elemento:

    if (value === "A3" || value === "A4" || value === "A7") {
        values.splice(index, 1, 'newVal');
    };
    
    //Expected: [ 'A0', 'A1', 'A2', 'newVal', 'newVal', 'A5', 'A6', 'newVal', 'A8' ]

    Nota: si la aplicación de ambas ‘antes’ y ‘después’ inserta, el código debe manejar ‘antes de que’ se inserta en primer lugar, de otra manera no sería tan esperado

Dejar respuesta

Please enter your comment!
Please enter your name here