reduceRight
Apply a function against an accumulator and each element in an array while iterating from right to left and return the accumulated result.
Usage
var reduceRight = require( '@stdlib/utils/reduce-right' );
reduceRight( arr, initial, reducer[, thisArg ] )
Applies a function against an accumulator and each element in an array while iterating from right to left and returns the accumulated result.
function sum( accumulator, value ) { return accumulator + value; } var arr = [ 1, 2, 3, 4 ]; var out = reduceRight( arr, 0, sum ); // returns 10
The function accepts both array-like objects and ndarray-like objects.
var array = require( '@stdlib/ndarray/array' ); function sum( accumulator, value ) { return accumulator + value; } var opts = { 'dtype': 'generic' }; var arr = array( [ [ 1, 2, 3 ], [ 4, 5, 6 ] ], opts ); var out = reduceRight( arr, 0, sum ); // returns 21
The applied function is provided the following arguments:
- accumulator: accumulated value.
- value: array element.
- index: element index.
- arr: input array.
To set the this context when invoking the input function, provide a thisArg.
function sum( accumulator, value ) { this.count += 1; return accumulator + value; } var arr = [ 1, 2, 3, 4 ]; var ctx = { 'count': 0 }; var out = reduceRight( arr, 0, sum, ctx ); // returns 10 var mean = out / ctx.count; // returns 2.5
Notes
-
For input arrays, the function differs from
Array.prototype.reduceRightin the following ways:- The function requires an
initialvalue for theaccumulator. Theinitialvalue is used during the first invocation of thereducerfunction. - The function does not skip the last array element.
- The function does not skip
undefinedelements. - The function does not support dynamic array-like objects (i.e., array-like objects whose
lengthchanges during execution).
- The function requires an
-
The function supports array-like objects exposing getters and setters for array element access (e.g.,
Complex64Array,Complex128Array, etc).var Complex64Array = require( '@stdlib/array/complex64' ); var Complex64 = require( '@stdlib/complex/float32/ctor' ); var realf = require( '@stdlib/complex/float32/real' ); var imagf = require( '@stdlib/complex/float32/imag' ); function sum( acc, z ) { var re1 = realf( acc ); var im1 = imagf( acc ); var re2 = realf( z ); var im2 = imagf( z ); return new Complex64( re1+re2, im1+im2 ); } var x = new Complex64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 ] ); var v = reduceRight( x, new Complex64( 0.0, 0.0 ), sum ); // returns <Complex64> var re = realf( v ); // returns 16.0 var im = imagf( v ); // returns 20.0
-
For
ndarray-like objects, the function performs a reduction over the entire inputndarray(i.e., higher-orderndarraydimensions are flattened to a single-dimension). -
When applying a function to
ndarray-like objects, performance will be best forndarray-like objects which are single-segment contiguous.
Examples
var filledarrayBy = require( '@stdlib/array/filled-by' ); var discreteUniform = require( '@stdlib/random/base/discrete-uniform' ).factory; var naryFunction = require( '@stdlib/utils/nary-function' ); var add = require( '@stdlib/number/float64/base/add' ); var array = require( '@stdlib/ndarray/array' ); var reduceRight = require( '@stdlib/utils/reduce-right' ); function fill( i ) { var rand = discreteUniform( -10*(i+1), 10*(i+1) ); return filledarrayBy( 10, 'generic', rand ); } // Create a two-dimensional ndarray (i.e., a matrix): var x = array( filledarrayBy( 10, 'generic', fill ), { 'dtype': 'generic', 'flatten': true }); // Create an explicit binary function: var f = naryFunction( add, 2 ); // Compute the sum: var out = reduceRight( x, 0, f ); console.log( 'x:' ); console.log( x.data ); console.log( 'sum: %d', out );
See Also
@stdlib/utils/for-each-right: invoke a function for each element in a collection, iterating from right to left.@stdlib/utils/map-right: apply a function to each element in an array and assign the result to an element in an output array, iterating from right to left.@stdlib/utils/reduce: apply a function against an accumulator and each element in an array and return the accumulated result.@stdlib/utils/async/reduce-right: apply a function against an accumulator and each element in a collection and return the accumulated result, iterating from right to left.