groupEntriesBy

Group element entries according to an indicator function.

Usage

var groupEntriesBy = require( '@stdlib/array/base/group-entries-by' );

groupEntriesBy( x, indicator[, thisArg] )

Groups element entries according to an indicator function.

function indicator( v ) {
    return v[ 0 ];
}

var x = [ 'beep', 'boop', 'foo', 'bar' ];

var out = groupEntriesBy( x, indicator );
// returns { 'b': [ [ 0, 'beep' ], [ 1, 'boop' ], [ 3, 'bar' ] ], 'f': [ [ 2, 'foo' ] ] }

An indicator function is provided the following arguments:

  • value: current array element.
  • index: current array element index.
  • arr: input array.

To set the indicator function execution context, provide a thisArg.

function indicator( v ) {
    this.count += 1;
    return v[ 0 ];
}

var x = [ 'beep', 'boop', 'foo', 'bar' ];

var context = {
    'count': 0
};
var out = groupEntriesBy( x, indicator, context );
// returns { 'b': [ [ 0, 'beep' ], [ 1, 'boop' ], [ 3, 'bar' ] ], 'f': [ [ 2, 'foo' ] ] }

var cnt = context.count;
// returns 4

Notes

  • The value returned by an indicator function should be a value which can be serialized as an object key. As a counterexample,

    function indicator( v ) {
        return {};
    }
    var x = [ 'beep', 'boop', 'foo', 'bar' ];
    
    var out = groupEntriesBy( x, indicator );
    // returns { '[object Object]': [ [ 0, 'beep' ], [ 1, 'boop' ], [ 2, 'foo' ], [ 3, 'bar' ] ] }
    

    while each group identifier is unique, all input array elements resolve to the same group because each group identifier serializes to the same string.

Examples

var discreteUniform = require( '@stdlib/random/array/discrete-uniform' );
var take = require( '@stdlib/array/base/take-indexed' );
var groupEntriesBy = require( '@stdlib/array/base/group-entries-by' );

function indicator( v ) {
    // Use the first letter of each element to define groups:
    return v[ 0 ];
}

// Define an initial array of values:
var values = [ 'beep', 'boop', 'foo', 'bar', 'woot', 'woot' ];

// Sample from the initial array to generate a random collection:
var indices = discreteUniform( 100, 0, values.length-1, {
    'dtype': 'generic'
});
var x = take( values, indices );
// returns [...]

// Group the values:
var out = groupEntriesBy( x, indicator );
// returns {...}

console.log( out );
Did you find this page helpful?