61 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			61 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | var apply = require('./_apply'), | ||
|  |     arrayMap = require('./_arrayMap'), | ||
|  |     baseIteratee = require('./_baseIteratee'), | ||
|  |     baseRest = require('./_baseRest'); | ||
|  | 
 | ||
|  | /** Error message constants. */ | ||
|  | var FUNC_ERROR_TEXT = 'Expected a function'; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Creates a function that iterates over `pairs` and invokes the corresponding | ||
|  |  * function of the first predicate to return truthy. The predicate-function | ||
|  |  * pairs are invoked with the `this` binding and arguments of the created | ||
|  |  * function. | ||
|  |  * | ||
|  |  * @static | ||
|  |  * @memberOf _ | ||
|  |  * @since 4.0.0 | ||
|  |  * @category Util | ||
|  |  * @param {Array} pairs The predicate-function pairs. | ||
|  |  * @returns {Function} Returns the new composite function. | ||
|  |  * @example | ||
|  |  * | ||
|  |  * var func = _.cond([ | ||
|  |  *   [_.matches({ 'a': 1 }),           _.constant('matches A')], | ||
|  |  *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')], | ||
|  |  *   [_.stubTrue,                      _.constant('no match')] | ||
|  |  * ]); | ||
|  |  * | ||
|  |  * func({ 'a': 1, 'b': 2 }); | ||
|  |  * // => 'matches A'
 | ||
|  |  * | ||
|  |  * func({ 'a': 0, 'b': 1 }); | ||
|  |  * // => 'matches B'
 | ||
|  |  * | ||
|  |  * func({ 'a': '1', 'b': '2' }); | ||
|  |  * // => 'no match'
 | ||
|  |  */ | ||
|  | function cond(pairs) { | ||
|  |   var length = pairs == null ? 0 : pairs.length, | ||
|  |       toIteratee = baseIteratee; | ||
|  | 
 | ||
|  |   pairs = !length ? [] : arrayMap(pairs, function(pair) { | ||
|  |     if (typeof pair[1] != 'function') { | ||
|  |       throw new TypeError(FUNC_ERROR_TEXT); | ||
|  |     } | ||
|  |     return [toIteratee(pair[0]), pair[1]]; | ||
|  |   }); | ||
|  | 
 | ||
|  |   return baseRest(function(args) { | ||
|  |     var index = -1; | ||
|  |     while (++index < length) { | ||
|  |       var pair = pairs[index]; | ||
|  |       if (apply(pair[0], this, args)) { | ||
|  |         return apply(pair[1], this, args); | ||
|  |       } | ||
|  |     } | ||
|  |   }); | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = cond; |