reduce

  • Enlace amigable (slug) de la revisión: Referencia_de_JavaScript_1.5/Objetos_globales/Array/reduce
  • Título de la revisión: reduce
  • Id de la revisión: 175208
  • Creada:
  • Creador: Talisker
  • ¿Es la revisión actual? No
  • Comentario /* Ejemplo: Integrar un arreglo procedente de arreglos */

Contenido de la revisión

{{wiki.template('Traducción', [ "inglés", "Core JavaScript 1.5 Reference:Objects:Array:reduce", "en" ])}}

Resumen

Aplica una función simultáneamente a dos valores de un arreglo (de izquierda a derecha) para reducirlo a un único valor.

Método de Array
Implementado en: JavaScript 1.8 (Gecko 1.9a5 y posteriores)
Edición ECMAScript: Ninguna

Sintaxis

var result = array.reduce(funcion[, valorInicial]);

Parámetros

funcion 
Función a ejecutar para cada valor del arreglo.
valorInicial 
Objeto a usar como primer argumento en la primera llamada de la funcion.

Descripción

reduce ejecuta la funcion una vez para cada elemento presente en el arreglo, excluyendo los huecos del mismo, recibiendo cuatro argumentos: el valor inicial (o valor de la llamada previa de funcion), el valor del elemento actual, el índice actual y el arreglo sobre el que ocurre la iteración.

La llamada a la funcion de reduce se pareceríawould a esto:

.reduce(function(valorPrevio, valorActual, indice, arreglo){
  // ...
})

The first time the function is called, the previousValue and currentValue can be one of two values. If an initialValue was provided in the call to reduce, then previousValue will be equal to initialValue and currentValue will be equal to the first value in the array. If no initialValue was provided, then previousValue will be equal to the first value in the array and currentValue will be equal to the second.

Some example run-throughs of the function would look like this:

[0,1,2,3,4].reduce(function(previousValue, currentValue, index, array){
  return previousValue + currentValue;
});

// First call
previousValue = 0, currentValue = 1, index = 1

// Second call
previousValue = 1, currentValue = 2, index = 2

// Third call
previousValue = 3, currentValue = 3, index = 3

// Fourth call
previousValue = 6, currentValue = 4, index = 4

// array is always the object [0,1,2,3,4] upon which reduce was called

// Return Value: 10

And if you were to provide an initialValue, the result would look like this:

[0,1,2,3,4].reduce(function(previousValue, currentValue, index, array){
  return previousValue + currentValue;
}, 10);

// First call
previousValue = 10, currentValue = 0, index = 0

// Second call
previousValue = 10, currentValue = 1, index = 1

// Third call
previousValue = 11, currentValue = 2, index = 2

// Fourth call
previousValue = 13, currentValue = 3, index = 3

// Fifth call
previousValue = 16, currentValue = 4, index = 4

// array is always the object [0,1,2,3,4] upon which reduce was called

// Return Value: 20

Compatibility

reduce is a JavaScript extension to the ECMA-262 standard; as such it may not be present in other implementations of the standard. You can work around this by inserting the following code at the beginning of your scripts, allowing use of reduce in ECMA-262 implementations which do not natively support it. This algorithm is exactly the one used in Firefox and SpiderMonkey.

if (!Array.prototype.reduce)
{
  Array.prototype.reduce = function(fun /*, initial*/)
  {
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();

    // no value to return if no initial value and an empty array
    if (len == 0 && arguments.length == 1)
      throw new TypeError();

    var i = 0;
    if (arguments.length >= 2)
    {
      var rv = arguments[1];
    }
    else
    {
      do
      {
        if (i in this)
        {
          rv = this[i++];
          break;
        }

        // if array contains no values, no initial value to return
        if (++i >= len)
          throw new TypeError();
      }
      while (true);
    }

    for (; i < len; i++)
    {
      if (i in this)
        rv = fun.call(null, rv, this[i], i, this);
    }

    return rv;
  };
}

Ejemplos

Ejemplo: Resumir todos los valores de un arreglo

var total = [0, 1, 2, 3].reduce(function(a, b){ return a + b; });
// total == 6

Ejemplo: Integrar un arreglo a partir de arreglos

var integrado = [[0,1], [2,3], [4,5]].reduce(function(a,b) {
  return a.concat(b);
}, []);
// integrado es [0, 1, 2, 3, 4, 5]

Vea también

reduceRight


{{ wiki.languages( { "en": "en/Core_JavaScript_1.5_Reference/Objects/Array/reduce", "fr": "fr/R\u00e9f\u00e9rence_de_JavaScript_1.5_Core/Objets_globaux/Array/reduce", "ja": "ja/Core_JavaScript_1.5_Reference/Objects/Array/reduce" } ) }}

Fuente de la revisión

<p>
{{wiki.template('Traducción', [ "inglés", "Core JavaScript 1.5 Reference:Objects:Array:reduce", "en" ])}}
</p>
<h3 name="Resumen"> Resumen </h3>
<p>Aplica una función simultáneamente a dos valores de un arreglo (de izquierda a derecha) para reducirlo a un único valor.
</p>
<table class="fullwidth-table">
<tbody><tr>
<td class="header" colspan="2">Método de <a href="es/Referencia_de_JavaScript_1.5/Objetos_globales/Array">Array</a></td>
</tr>
<tr>
<td>Implementado en:</td>
<td>JavaScript 1.8 (Gecko 1.9a5 y posteriores)</td>
</tr>
<tr>
<td>Edición ECMAScript:</td>
<td>Ninguna</td>
</tr>
</tbody></table>
<h3 name="Sintaxis"> Sintaxis </h3>
<pre class="eval">var <i>result</i> = <i>array</i>.reduce(<i>funcion</i>[, <i>valorInicial</i>]);
</pre>
<h3 name="Par.C3.A1metros"> Parámetros </h3>
<dl><dt> <code>funcion</code> </dt><dd> Función a ejecutar para cada valor del arreglo.
</dd><dt> <code>valorInicial</code> </dt><dd> Objeto a usar como primer argumento en la primera llamada de la <code>funcion</code>.
</dd></dl>
<h3 name="Descripci.C3.B3n"> Descripción </h3>
<p><code>reduce</code> ejecuta la <code>funcion</code> una vez para cada elemento presente en el arreglo, excluyendo los huecos del mismo, recibiendo cuatro argumentos: el valor inicial (o valor de la llamada previa de <code>funcion</code>), el valor del elemento actual, el índice actual y el arreglo sobre el que ocurre la iteración.
</p><p>La llamada a la <code>funcion</code> de reduce se pareceríawould a esto:
</p>
<pre class="eval">.reduce(function(valorPrevio, valorActual, indice, arreglo){
  // ...
})
</pre>
<p>The first time the function is called, the <code>previousValue</code> and <code>currentValue</code> can be one of two values. If an <code>initialValue</code> was provided in the call to <code>reduce</code>, then <code>previousValue</code> will be equal to <code>initialValue</code> and <code>currentValue</code> will be equal to the first value in the array. If no <code>initialValue</code> was provided, then <code>previousValue</code> will be equal to the first value in the array and <code>currentValue</code> will be equal to the second.
</p><p>Some example run-throughs of the function would look like this:
</p>
<pre class="eval">[0,1,2,3,4].reduce(function(previousValue, currentValue, index, array){
  return previousValue + currentValue;
});

// First call
previousValue = 0, currentValue = 1, index = 1

// Second call
previousValue = 1, currentValue = 2, index = 2

// Third call
previousValue = 3, currentValue = 3, index = 3

// Fourth call
previousValue = 6, currentValue = 4, index = 4

// array is always the object [0,1,2,3,4] upon which reduce was called

// Return Value: 10
</pre>
<p>And if you were to provide an <code>initialValue</code>, the result would look like this:
</p>
<pre class="eval">[0,1,2,3,4].reduce(function(previousValue, currentValue, index, array){
  return previousValue + currentValue;
}, 10);

// First call
previousValue = 10, currentValue = 0, index = 0

// Second call
previousValue = 10, currentValue = 1, index = 1

// Third call
previousValue = 11, currentValue = 2, index = 2

// Fourth call
previousValue = 13, currentValue = 3, index = 3

// Fifth call
previousValue = 16, currentValue = 4, index = 4

// array is always the object [0,1,2,3,4] upon which reduce was called

// Return Value: 20
</pre>
<h3 name="Compatibility"> Compatibility </h3>
<p><code>reduce</code> is a JavaScript extension to the ECMA-262 standard; as such it may not be present in other implementations of the standard.  You can work around this by inserting the following code at the beginning of your scripts, allowing use of <code>reduce</code> in ECMA-262 implementations which do not natively support it.  This algorithm is exactly the one used in Firefox and SpiderMonkey.
</p>
<pre class="eval">if (!Array.prototype.reduce)
{
  Array.prototype.reduce = function(fun /*, initial*/)
  {
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();

    // no value to return if no initial value and an empty array
    if (len == 0 &amp;&amp; arguments.length == 1)
      throw new TypeError();

    var i = 0;
    if (arguments.length &gt;= 2)
    {
      var rv = arguments[1];
    }
    else
    {
      do
      {
        if (i in this)
        {
          rv = this[i++];
          break;
        }

        // if array contains no values, no initial value to return
        if (++i &gt;= len)
          throw new TypeError();
      }
      while (true);
    }

    for (; i &lt; len; i++)
    {
      if (i in this)
        rv = fun.call(null, rv, this[i], i, this);
    }

    return rv;
  };
}
</pre>
<h3 name="Ejemplos"> Ejemplos </h3>
<h4 name="Ejemplo:_Resumir_todos_los_valores_de_un_arreglo"> Ejemplo: Resumir todos los valores de un arreglo </h4>
<pre class="eval">var total = [0, 1, 2, 3].reduce(function(a, b){ return a + b; });
// total == 6
</pre>
<h4 name="Ejemplo:_Integrar_un_arreglo_a_partir_de_arreglos"> Ejemplo: Integrar un arreglo a partir de arreglos </h4>
<pre class="eval">var integrado = [[0,1], [2,3], [4,5]].reduce(function(a,b) {
  return a.concat(b);
}, []);
// integrado es [0, 1, 2, 3, 4, 5]
</pre>
<h3 name="Vea_tambi.C3.A9n"> Vea también </h3>
<p><a href="es/Referencia_de_JavaScript_1.5/Objetos_globales/Array/reduceRight">reduceRight</a>
</p><p><br>
</p>
<div class="noinclude">
</div>
{{ wiki.languages( { "en": "en/Core_JavaScript_1.5_Reference/Objects/Array/reduce", "fr": "fr/R\u00e9f\u00e9rence_de_JavaScript_1.5_Core/Objets_globaux/Array/reduce", "ja": "ja/Core_JavaScript_1.5_Reference/Objects/Array/reduce" } ) }}
Revertir a esta revisión