array ranges summ

by Sergei Sokolov

HTML

<div id="output"></div>

CSS

#output{
    font-size:10px;
}

JavaScript

( function(w,undefined){
	var RNG = {
		range2array: function(range) {
		    var ret=[];
		    for (var i=range.min;i<=range.max;i++) ret.push(i);
		    return ret;
		}
		
		,arrays_summ: function(array1,array2) {
		    var ret=array1;
		    if (array2===undefined) return ret
		    for (var i in array1) 
		        for (var n in array2) 
		          this.unique_push(ret, array1[i]*1+array2[n]);
		    for (var n in array2)
		        this.unique_push(ret, array2[n]*1);
		    return ret;
		}
		
		,process: function(ranges, result, shift) {
		    if (shift == undefined) shift=-1; // если вызывается только с ranges, то это первый вызов, задаем стартовые значения
		    if (result == undefined) result=[];
		    shift++; // увеличиваем на 1 для каждого нового рекурсивного вызова
		    if (shift == ranges.length) {
		    	return result.sort( this.sorter); // сложили все, возвращаем результат
	    	}
		    result= this.arrays_summ( result, this.range2array(ranges[shift])); 
		    return this.process(ranges, result, shift);
		}
		
		,sorter: function(a,b){
			return (a*1)>(b*1)?1:-1;
		}

		,unique_push: function(arr, val){
		    if (arr.indexOf(val) == -1) arr.push(val);
		}
		
		,output: function( html){
			$('#output').append('<div><pre>'+html+'</pre></div>');
		}
		
        ,test: function( set){
			this.output( this.process( set));
		}
	}
	w.RNG = RNG;
})(window);

RNG.test( [{"min":2,"max":3},{"min":1,"max":20},{"min":3,"max":5},{min: 2,max: 10}] );
RNG.test( [{"min":1,"max":2},{"min":3,"max":4},{"min":5,"max":6}] );