function groupValues( x, groups ) {
	var xget;
	var gget;
	var len;
	var out;
	var g;
	var o;
	var v;
	var i;

	// Get the number of elements to group:
	len = x.length;
	if ( groups.length !== len ) {
		throw new RangeError( 'invalid argument. The first and second arguments must have the same length.' );
	}
	// Resolve accessors for retrieving array elements:
	xget = resolveGetter( x );
	gget = resolveGetter( groups );

	// Loop over the elements and assign each to a group...
	out = {};
	for ( i = 0; i < len; i++ ) {
		v = xget( x, i );
		g = gget( groups, i ).toString();
		o = out[ g ];
		if ( isArray( o ) ) {
			o.push( v );
		} else {
			out[ g ] = [ v ];
		}
	}
	return out;
}
Groups elements as arrays associated with distinct keys.

@param {Collection} x - input array
@param {Collection} groups - array defining which group an element in the input array belongs to
@throws {RangeError} must provide arrays having the same length
@returns {Object} group results

@example
var x = [ 'beep', 'boop', 'foo', 'bar' ];
var groups = [ 'b', 'b', 'f', 'b' ];

var out = groupValues( x, groups );
// returns { 'b': [ 'beep', 'boop', 'bar' ], 'f': [ 'foo' ] }