close

  打基礎的作業練習,用到的技巧:array, object, set, random(陣列、物件、集合、亂數), v-for

  這次要做的是寫一個樂透亂數程式,有第一區1~第一區6,還有第二區。第一區可選的號碼有1~38,不可重複。第二區是1~8

  完成後如下,每次f5之後出現的數字會改變,因為亂數。

  寫了兩種,一種是全部都陣列,一種是用物件去接,把a的字串當作key。(因為一開始琢磨不出來後者怎麼寫XDD

  

第一區1 ------- 13

第一區2 ------- 11

第一區3 ------- 26

第一區4 ------- 37

第一區5 ------- 6

第一區6 ------- 34

第二區 ------- 4

 

  因為公司用的框架是vue,所以就用vue寫。(js也可以完成)

 

  先做一個陣列a,放字串'第一區1', '第一區2'…,之後要新增刪除都直接改陣列a即可。

 

  亂數的部分,直接用js內建的Math.floorMath.random

  Math.floor回傳小於指定數字的最大整數值,

  Math.random回傳介於0~1之間的亂數,包含0但不包含1

    寫一個function

  getrandom(min, max)

            return Math.floor(Math.random() * (max - min + 1) + 1)      

 

  設定minmax這樣第二區的亂數也可以使用同一個function獲得。

 

  為了得到不重複的亂數,宣告一個集合f1,每次執行亂數都把值塞進f1

  然後如果不是第一次執行getrandomf1裡又有相同值,即表示重複,再次執行getrandom,直到f1沒有相同值(while實作)

  第二區的亂數,用個隨便變數記住a最後一個index,再執行一次getrandom即可獲得。

 

方法1是將要印出的內容用第二個陣列b顯示,把aforEach跑一遍然後在裡面對bpush即可。

html

<div id="prac0719">

<div v-for="(item,index) in b">{{ b[index] }}</div>

</div>

 

js

let vm = new Vue({

    el: "#prac0719",

    data() {

        return {

            a: ['第一區1', '第一區2', '第一區3', '第一區4', '第一區5', '第一區6', '第二區'],

            b: []

        }

    },

    mounted: function() {

        let d = []

        let f1 = new Set()

        for (var x in this.a) {

            d[x] = this.getrandom(1, 38)

            while (f1.has(d[x])) d[x] = this.getrandom(1, 38)

            f1.add(d[x])

        }

        d[x] = this.getrandom(1, 8)

        let i = 0

        this.a.forEach(c =>this.b.push(`${c}-------${d[i++]}`))

    },

    methods: {

        getrandom(min, max) {  

            return Math.floor(Math.random() * (max - min + 1) + 1)          

        }

    }

})

</script>

 

  也沒啥難的,其實反而是在html顯示上卡住比較久。

  比較值得講講的也就forEach了,我一直覺得不太懂他在幹嘛。

  經過幾次實驗之後總算有一點小心得。

  forEach裡面接一個function,這邊用ES6的箭頭函數,反正就把他想成一個return後面的東西的代號就好。

  forEach執行每個陣列裡面的值,我是想成把值用回傳的functionc來代替,這種思路比較好讓我自己理解。

  template literal (模板字串符)`${ }`也是ES6的寫法,可以跨行顯示字串,可以在字串裡面放變數,超級好用,不用讓你的字串遇到變數時就一直蠢蠢的+++

  d[i++]也沒啥好解釋的,就直接在forEach裡面跑d這樣,最後出來結果就是如上圖。

 

  方法2則是把陣列b改成物件oo

  把a的字串當作keyd的亂數當作value

  練習一下擴充運算符,把a複製過來變成另一個陣列cc

 

  html

<div id="prac0719">

<div v-for="(item,index,key) in oo">

  {{ Object.keys(oo)[key]}} ------- {{ Object.values(oo)[key] }}

</div>

</div>

 

  js

<script>

let vm = new Vue({

    el: "#prac0719",

    data() {

        return {

            a: ['第一區1', '第一區2', '第一區3', '第一區4', '第一區5', '第一區6', '第二區'],

            cc: [],

            oo: {}

        }

    },

    mounted: function() {

        let d = []

        let f1 = new Set()

        for (var x in this.a) {

            d[x] = this.getrandom(1, 38)

            while (f1.has(d[x])) d[x] = this.getrandom(1, 38)

            f1.add(d[x])

        }

        d[x] = this.getrandom(1, 8)

        i = 0

        this.cc = [...this.a]

        this.cc.forEach(dd =>this.oo[dd] = d[i++])

    },

    methods: {

        getrandom(min, max) {

            return Math.floor(Math.random() * (max - min + 1) + 1)    

        }

    }

})

  大概就是這樣,很基礎的作業,但是如果基礎本來就不穩,可能還是要花點時間,比如我=w=

 

arrow
arrow

    你好我是CC 發表在 痞客邦 留言(0) 人氣()