不能使用for迴圈,傳入n和m, 生成一個長度為n,每一項都是m的陣列

我在長安長安發表於2019-02-16

逛知乎的時候看到一個問題,不能使用for迴圈,傳入n和m, 生成一個長度為n,每一項都是m的陣列。第一反應是遞迴,然後再想到正則,還在思考中…

遞迴法

function getArr(n,m) {
    // 方法一: 遞迴
    let arr = new Array(n)
    function setData (index) {
        if (index >= 0) {
            if (!arr[index]) {
                arr[index] = m
            }
            setData(index - 1)
        }
    }
    setData(arr.length - 1)
    return arr
} 
getArr(10, `aa`) // ["aa", "aa", "aa", "aa", "aa", "aa", "aa", "aa", "aa", "aa"]

正則法

function getArr(n,m) {
    // 方法二: 正則 (缺點:當傳入的資料帶,時,以,為分隔符會出錯,邏輯還需要優化)
    let str = new Array(n).join(` `) // 生成對應長度的字串
    str = str.replace(/s?/g, m)     // 使用正則替換得到對應的字串
    str = str.replace(new RegExp(`(${m})`, `g`), `$1,`) // 得到逗號分隔的字串
    str = str.substring(0, str.length - 1)
    return str.split(`,`)
} 
getArr(3, `12345`) // ["12345", "12345", "12345"]

fill()

  • 來自ntnyq, ntnyq說的陣列的fill()方法,之前都不知道的,感謝,然後立刻就想到了類似可以去完成功能的,map()和filter()。
function getArr(n,m) {
    // 方法三: fill()
    return Array(n).fill(m)
} 
getArr(10, `aa`) // ["aa", "aa", "aa", "aa", "aa", "aa", "aa", "aa", "aa", "aa"]

map()

function getArray(n, m){
    return result = Array(n).join(",").split(",").map(() => {
        return m
    })
}

while

用while用的少,一下就想不起來了…


希望能看到大家更好的方法,感覺自己進了死衚衕…

相關文章