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;
 |