用原生JS產生隨機長度和隨機值的數組

之前一直想寫個產生隨機數組的方法,現在終於做了。向封裝好的方法傳入四個參數:數組最小長度、數組最大長度、數組元素最小值、數組元素最大值。調用產生數組的方法後,再用同一命名空間內的結果數組獲取結果就行。

下面上硬硬的乾貨(100%源代碼,揭示了整個"過程"-_^||):

////Version Zero 
        ////粗糙版本,提供了生成隨機數組(最大長度7、數組元素最大值7)的功能,但代碼不好複用,全局變量太多,子函數太分散。
        ////功能性符合需求,魯棒性(健壯性)、可擴展性、可維護性、靈活性、複用性都不高

        //var arrRandomNums = [];
        //var maxShowNum = getRandCount();

        //function getRandCount() {
        //    var num = parseInt(Math.random() * 10);
        //    return num > 7 ? 7 : num;
        //}
        //var generateRamdonNumber = function (count) {
        //    var rand = parseInt(Math.random() * 10);
        //    if (rand > 7) {
        //        return false;
        //    }
        //    for (var i = 0; i < arrRandomNums.length; i++) {
        //        if (arrRandomNums[i] == rand) {
        //            return false;
        //        } else {
        //        }
        //    }
        //    arrRandomNums.push(rand);
        //}

        //var needReason = function () {
        //    for (var i = 0; ; i++) {
        //        if (arrRandomNums.length < maxShowNum) {
        //            generateRamdonNumber(maxShowNum);
        //        } else {
        //            break;
        //        }
        //    }
        //}
        //$(document).ready(function () {
        //    $('#btnNeedReason').on('click', function () {
        //        maxShowNum = getRandCount();
        //        arrRandomNums = [];
        //        needReason();
        //        $('#testFun input[name="cbcShowCols"]').each(function (ind) {
        //            var isShow = false;
        //            for (var i = 0; i < arrRandomNums.length; i++) {
        //                if (arrRandomNums[i] == ind) {
        //                    isShow = true;
        //                    i = arrRandomNums.length;
        //                }
        //            }
        //            $(this).prop('checked', isShow);
        //        });
        //    });
        //    $('#btnFilterCols').on('click', function () {
        //        var currentSelectShowCols = [];
        //        $('#testFun input[name="cbcShowCols"]:checked').each(function (ind) {
        //            currentSelectShowCols.push($(this).val());
        //        });
        //        var strCols = currentSelectShowCols.join('-');
        //        $.post(
        //            '/UserDashboard/ChangeShowColumn',
        //            {
        //                showCol: strCols
        //            }, function (res) {
        //                if (res.slt.toLowerCase() == 'true') {
        //                    //alert(res.msg);
        //                    window.location.reload(true);
        //                } else {
        //                    alert('error' + res.msg);
        //                }
        //            }
        //            );
        //    });
        //});







        ////Version One percent five
        //嘗試在一個獨立namespace內,用閉包產生一組長度、大小不固定的隨機數組,沒成功!!!!

        //(function () {
        //    var _NS = function () {

        //    }
        //    _NS.prototype.alert = function () {
        //        alert('900');
        //        return 900;
        //    }
        //    window.NS = new _NS();
        //})();


        //(function () {
        //    this.arrRandomNums = [];
        //    this.maxShowNum = 900;
        //    this.myfunction = function () {
        //        alert(maxShowNum);
        //        return maxShowNum;
        //    }
        //    window.GetRandomArray = this;
        //})();


        //var GetRandomArray = {
        //    arrRandomNums: [],
        //    maxShowNum : 0,
        //    myfunction : function () {
        //        alert(maxShowNum);
        //    }
        //}







        ////Version One
        ////依據單一原則,開閉原則,將分散的函數合併到一起

        ////數據倉儲data warehouse
        //var DataInfoMining = {
        //    randomNums: [2, 1, 3, 2, 1, 3]
        //};

        //方法
        //var tryGenerateRandomArr = function (maxShowNum, numMaxValue) {
        //    var arrRandomNums = [];
        //    //console.log('maxShowNum : ' + maxShowNum + 'numMaxValue : ' + numMaxValue);

        //    //獲取隨機數
        //    var getSingleRandNum = function (maxValueLimit) {
        //        var num = parseInt(Math.random() * 10);
        //        return num > maxValueLimit ? maxValueLimit : num;
        //    };
        //    var ShowNums = getSingleRandNum(maxShowNum);

        //    //動態生成隨機數組
        //    var needReasonWhyCheckBoxNotClick = function () {
        //        arrRandomNumsLocal = [];
        //        for (var i = 0; i < ShowNums; i++) {
        //            var RandNumber = getSingleRandNum(numMaxValue);
        //            arrRandomNumsLocal.push(RandNumber);
        //        }
        //        return arrRandomNumsLocal;
        //    }
        //    arrRandomNums = needReasonWhyCheckBoxNotClick();
        //    //for (var i = 0; i < arrRandomNums.length; i++) {
        //    //    console.log('get arrRandomNums[' + i + '] : ' + arrRandomNums[i]);
        //    //}
        //    return arrRandomNums;
        //}
        //window.onload = function () {
        //    DataInfoMining.randomNums = tryGenerateRandomArr(8, 3);
        //    for (var i = 0; i < DataInfoMining.randomNums.length; i++) {
        //        console.log('get arrRandomNums[' + i + '] : ' + DataInfoMining.randomNums[i]);
        //    }
        //};
        //$(document).ready(function () {
        //    $('#btnNeedReason').on('click', function () {
        //        var arrRandomNums = DataInfoMining.randomNums;
        //        $('#testFun input[name="cbcShowCols"]').each(function (ind) {
        //            var isShow = false;
        //            for (var i = 0; i < arrRandomNums.length; i++) {
        //                if (arrRandomNums[i] == ind) {
        //                    isShow = true;
        //                    i = arrRandomNums.length;
        //                }
        //            }
        //            $(this).prop('checked', isShow);
        //        });
        //    });
        //    $('#btnFilterCols').on('click', function () {
        //        var currentSelectShowCols = [];
        //        $('#testFun input[name="cbcShowCols"]:checked').each(function (ind) {
        //            currentSelectShowCols.push($(this).val());
        //        });
        //        var strCols = currentSelectShowCols.join('-');
        //        $.post(
        //            '/UserDashboard/ChangeShowColumn',
        //            {
        //                showCol: strCols
        //            }, function (res) {
        //                if (res.slt.toLowerCase() == 'true') {
        //                    //alert(res.msg);
        //                    window.location.reload(true);
        //                } else {
        //                    alert('error' + res.msg);
        //                }
        //            }
        //            );
        //    });
        //});







        ////Version Two

        ////數據和方法封裝在一個命名空間內,防止namespace pollution和便於管理(比如維護、擴展)
        //var DataInfoMining = {
        //    randomNums: [1, 3, 1, 4, 6, 6, 6, 2, 1, 3, 2, 1, 3],
        //    tryGenerateRandomArr: function (maxShowNum, numMaxValue) {
        //        try {
        //        //獲取隨機數
        //        var getSingleRandNum = function (maxValueLimit) {
        //            var num = parseInt(Math.random() * 10);
        //            return num > maxValueLimit ? maxValueLimit : num;
        //        };
        //        //數組長度隨機,但不超過最大值maxShowNum
        //        var ShowNums = getSingleRandNum(maxShowNum);

        //        //動態生成隨機數組
        //        var needReasonWhyCheckBoxNotClick = function (outsideShowNum) {
        //            DataInfoMining.randomNums = [];
        //            for (var i = 0; i < 1000; i++) {
        //                //數組元素值不超過最大值numMaxValue
        //                var RandNumber = getSingleRandNum(numMaxValue);
        //                //數組元素是否重複
        //                var isReperatValue = false;
        //                var len = DataInfoMining.randomNums.length;
        //                for (var j = 0; j < len; j++) {
        //                    if (DataInfoMining.randomNums[j] == RandNumber) {
        //                        isReperatValue = true;
        //                        j = len;
        //                    }
        //                }
        //                //數組長度是否達到要求,達到要求退出
        //                var isGetAndLeave = false;
        //                if (!isReperatValue) {
        //                    DataInfoMining.randomNums.push(RandNumber);
        //                    //滿足數組長度後退出
        //                    if (DataInfoMining.randomNums.length == outsideShowNum) {
        //                        isGetAndLeave = true;
        //                    }
        //                }
        //                if (isGetAndLeave) {
        //                    console.debug('current i : ' + i);
        //                    break;
        //                }
        //            }
        //        }
        //        //!!!!ShowNums無法在needReasonWhyCheckBoxNotClick內自動獲取到,只能通過形參傳進方法內
        //        needReasonWhyCheckBoxNotClick(ShowNums);

        //        //console.log('maxShowNum : ' + maxShowNum + 'numMaxValue : ' + numMaxValue);
        //        //for (var i = 0; i < DataInfoMining.randomNums.length; i++) {
        //        //    console.log('get arrRandomNums[' + i + '] : ' + DataInfoMining.randomNums[i]);
        //        //}
        //        } catch (e) {
        //            console.error(e + '====' + e.message);
        //        }
        //    }
        //};







        //Version Three
        ////之前數組長度和元素值,只有最大值限制(maxShowLen\numMaxValue),現在增加最小值限制

        //數據和方法封裝在一個命名空間內,防止namespace pollution和便於管理(比如維護、擴展)
        var DataInfoMining = {
            randomNums: [1, 3, 1, 4, 6, 6, 6, 2, 1, 3, 2, 1, 3],
            tryGenerateRandomArr: function (minShowLen, maxShowLen, numMinValue, numMaxValue) {
                try {
                    //獲取隨機數
                    var getSingleRandNum = function (minValueLimit, maxValueLimit) {
                        var num = parseInt(Math.random() * 10);

                        //num = num > maxValueLimit ? maxValueLimit : num;
                        return num < minValueLimit ? minValueLimit : num > maxValueLimit ? maxValueLimit : num;
                    };
                    //數組長度隨機,但不超過最大值maxShowLen
                    var ShowNums = getSingleRandNum(minShowLen, maxShowLen);

                    //動態生成隨機數組
                    var needReasonWhyCheckBoxNotClick = function (outsideShowNum) {
                        DataInfoMining.randomNums = [];
                        for (var i = 0; i < 1000; i++) {
                            //數組元素值不超過最大值numMaxValue
                            var RandNumber = getSingleRandNum(numMinValue, numMaxValue);
                            //數組元素是否重複
                            var isReperatValue = false;
                            var len = DataInfoMining.randomNums.length;
                            for (var j = 0; j < len; j++) {
                                if (DataInfoMining.randomNums[j] == RandNumber) {
                                    isReperatValue = true;
                                    j = len;
                                }
                            }
                            //數組長度是否達到要求,達到要求退出
                            var isGetAndLeave = false;
                            if (!isReperatValue) {
                                DataInfoMining.randomNums.push(RandNumber);
                                //滿足數組長度後退出
                                if (DataInfoMining.randomNums.length == outsideShowNum) {
                                    isGetAndLeave = true;
                                }
                            }
                            if (isGetAndLeave) {
                                console.debug('current i : ' + i);
                                break;
                            }
                        }
                    }
                    //!!!!ShowNums無法在needReasonWhyCheckBoxNotClick內自動獲取到,只能通過形參傳進方法內
                    needReasonWhyCheckBoxNotClick(ShowNums);

                    //單元測試、持續集成測試Test Drive Developing(TDD) 
                    //console.log('maxShowLen : ' + maxShowLen + 'numMaxValue : ' + numMaxValue);
                    //for (var i = 0; i < DataInfoMining.randomNums.length; i++) {
                    //    console.log('get arrRandomNums[' + i + '] : ' + DataInfoMining.randomNums[i]);
                    //}
                } catch (e) {
                    console.error(e + '====' + e.message);
                }
            }
        };
        //window.onload = function () {
        //    console.log(console.time('========time profile========'));
        //    DataInfoMining.tryGenerateRandomArr(8, 8);
        //    //DataInfoMining.randomNums = tryGenerateRandomArr(8, 8);
        //    console.trace('after creating trace: ');
        //    console.debug('after creating debug: ');
        //    console.hasOwnProperty('log');
        //    console.hasOwnProperty('test');
        //    console.info('after creating info: ');
        //    console.assert(true, 'after creating info: ');
        //    for (var i = 0; i < DataInfoMining.randomNums.length; i++) {
        //        console.log('arrRandomNums[' + i + '] : ' + DataInfoMining.randomNums[i]);
        //    }
        //    console.log(console.time('========time profile========'));
        //};
        $(document).ready(function () {
            $('#btnNeedReason').on('click', function () {
                DataInfoMining.tryGenerateRandomArr(1, 4, 4, 7);
                var arrRandomNums = DataInfoMining.randomNums;
                $('#testFun input[name="cbcShowCols"]').each(function (ind) {
                    var isShow = false;
                    for (var i = 0; i < arrRandomNums.length; i++) {
                        if (arrRandomNums[i] == ind) {
                            isShow = true;
                            i = arrRandomNums.length;
                        }
                    }
                    $(this).prop('checked', isShow);
                });
            });
            $('#btnFilterCols').on('click', function () {
                var currentSelectShowCols = [];
                $('#testFun input[name="cbcShowCols"]:checked').each(function (ind) {
                    currentSelectShowCols.push($(this).val());
                });
                var strCols = currentSelectShowCols.join('-');
                $.post(
                    '/UserDashboard/ChangeShowColumn',
                    {
                        showCol: strCols
                    }, function (res) {
                        if (res.slt.toLowerCase() == 'true') {
                            //alert(res.msg);
                            window.location.reload(true);
                        } else {
                            alert('error' + res.msg);
                        }
                    }
                    );
            });
        });

文件傳送門:http://download.csdn.net/detail/changshenglugu/9107333

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章