iterUniqueBy

Create an iterator which returns unique values according to a predicate function.

Usage

var iterUniqueBy = require( '@stdlib/iter/unique-by' );

iterUniqueBy( iterator, predicate[, thisArg] )

Returns an iterator which returns unique values according to a predicate function.

var array2iterator = require( '@stdlib/array/to-iterator' );

function predicate( a, b ) {
    return ( a !== b );
}

var src = array2iterator( [ 2, 1, 1, 2, 4, 3, 4, 3 ] );

var it = iterUniqueBy( src, predicate );
// returns <Object>

var v = it.next().value;
// returns 2

v = it.next().value;
// returns 1

v = it.next().value;
// returns 4

v = it.next().value;
// returns 3

var bool = it.next().done;
// returns true

The returned iterator protocol-compliant object has the following properties:

  • next: function which returns an iterator protocol-compliant object containing the next iterated value (if one exists) assigned to a value property and a done property having a boolean value indicating whether the iterator is finished.
  • return: function which closes an iterator and returns a single (optional) argument in an iterator protocol-compliant object.

A predicate function is provided two arguments:

  • a: a previously identified unique value
  • b: the value whose uniqueness is being determined

To set the execution context of the predicate function, provide a thisArg.

var array2iterator = require( '@stdlib/array/to-iterator' );

function predicate( a, b ) {
    this.count += 1;
    return ( a.v !== b.v );
}

var values = [
    { 'v': 2 },
    { 'v': 1 },
    { 'v': 1 },
    { 'v': 2 },
    { 'v': 4 },
    { 'v': 3 },
    { 'v': 4 },
    { 'v': 3 }
];

var src = array2iterator( values );

var ctx = {
    'count': 0
};

var it = iterUniqueBy( src, predicate, ctx );
// returns <Object>

var v = it.next().value;
// returns { 'v': 2 }

v = it.next().value;
// returns { 'v': 1 }

v = it.next().value;
// returns { 'v': 4 }

v = it.next().value;
// returns { 'v': 3 }

var bool = it.next().done;
// returns true

bool = ( ctx.count > 0 );
// returns true

Notes

  • A returned iterator internally buffers unique values and, thus, has O(N) memory requirements.
  • A predicate function is invoked for each iterated value against each value in an internal buffer consisting of previously identified unique values. Thus, as the number of unique values grows, so, too, does the number of predicate function invocations per iterated value.
  • An iterated value is considered "unique" if the predicate function returns truthy values for all comparisons of the iterated value with each value in the internal buffer.
  • If an environment supports Symbol.iterator and a provided iterator is iterable, the returned iterator is iterable.

Examples

var discreteUniform = require( '@stdlib/random/iter/discrete-uniform' );
var iterUniqueBy = require( '@stdlib/iter/unique-by' );

function predicate( a, b ) {
    return ( a !== b );
}

// Create a seeded iterator which can generate 1000 pseudorandom numbers:
var rand = discreteUniform( 1, 10, {
    'seed': 1234,
    'iter': 1000
});

// Create an iterator which returns unique values:
var it = iterUniqueBy( rand, predicate );

// Perform manual iteration...
var v;
while ( true ) {
    v = it.next();
    if ( v.done ) {
        break;
    }
    console.log( v.value );
}
Did you find this page helpful?