<script type="text/javascript">
    //求一个数组内任意N个元素组合
    function group(a, len){
        var arr = a.slice(0),item = [arr.shift()];
        (function func(item,arr){
            var itemc,temp = arr.slice(0),l = len - item.length;
            if( l == 0){
                result.push(item);
            }else if( l == 1){
                for(var j in arr){
                    itemc = item.slice(0);
                    itemc.push(arr[j]);
                    result.push(itemc);
                }
            }else if( l > 1){
                itemc = item.slice(0);
                itemc.push(temp.shift());
                func(itemc,temp);
                item.length + temp.length >= len && func(item,temp);
            }
        })(item,arr);
        arr.length >= len && group(arr, len);
        return result;
    }    var arr=[2,3,2,1,3];//指定数组,计算所有情况组合
    for(var l=2;l<arr.length;l++){
        var result=[],temp=group(arr,l),str="";
        for(var i=0;i<temp.length;i++){
            str += "+"+temp[i].join("*");
        }
        document.write(l+"组合: "+str.substring(1)+"="+eval(str.substring(1))+"<br/>");
    }
</script>
2组合: 2*3+2*2+2*1+2*3+3*2+3*1+3*3+2*1+2*3+1*3=47
3组合: 2*3*2+2*3*1+2*3*3+2*2*1+2*2*3+2*1*3+3*2*1+3*2*3+3*1*3+2*1*3=97
4组合: 2*3*2*1+2*3*2*3+2*3*1*3+2*2*1*3+3*2*1*3=96

解决方案 »

  1.   

    我也來提供一下非eval的版本:
    function calc(arr, n) {
        var sum = function (arr) {
            var result = 1;
            for (var i = 0; i < arr.length; i++) {
                result *= arr[i];
            }
            return result;
        };
        var loop = function (_arr, start, p, arr, callback) {
            var result = 0;
            var count = start;
            arr = arr || [];                
            for (var i = start; i < _arr.length; i++) {
                var tmparr = arr.slice(0).concat([_arr[i]]);
                if (p < n) {
                    result += loop.call(null, _arr.slice(1), count, p + 1, tmparr);
                }
                if (tmparr.length == n) {
                    result += sum(tmparr);
                }
                count++;
            }
            return result;
        };
        return loop(arr, 0, 1);
    }var a = [2, 3, 1, 3, 2];
    console.log(calc(a, 2));//47
    console.log(calc(a, 3));//97
    console.log(calc(a, 4));//96//如果不嫌棄使用prototype的話Array.prototype.calc = function (n) {
        return calc.call(null, this, n);
    };console.log(a.calc(2));//47
    console.log(a.calc(3));//97
    console.log(a.calc(4));//96