JavaScript中的新數(shù)組切片表示法——array[start:stop:step]
使用這種新的切片表示法,我們將不再編寫如下的 slice() 代碼:
圖片
而是可以像這樣編寫代碼:
圖片
這種寫法不僅更簡潔、可讀性更強(qiáng),而且更直觀。
更棒的是,我們不必等到它正式發(fā)布——現(xiàn)在就可以使用它。你可以通過擴(kuò)展 Array 類來實(shí)現(xiàn)這個功能:
圖片
處理未指定的結(jié)束索引
如果我們省略第二個數(shù)字(即 end 參數(shù)),數(shù)組會切片到最后一個元素嗎?
圖片
它不會這樣做?
圖片
這是因?yàn)?end 被賦值為空字符串,而 Number('') 的結(jié)果是 0,所以我們得到了 arr.slice(n, 0),它總是返回一個空數(shù)組。
為了解決這個問題,我們可以對 r() 方法進(jìn)行升級,使其能夠正確處理這種情況:
圖片
圖片
處理負(fù)索引
這個新方法能處理負(fù)索引嗎?
圖片
當(dāng)然可以!
圖片
負(fù)的 start 或 end 值會直接傳遞給 slice(),因?yàn)樗呀?jīng)內(nèi)置了對負(fù)索引的支持。
起始-結(jié)束-步長
我們再次升級,支持 array[start:stop:step],也就是支持以固定的間隔跳過數(shù)組中的元素。
正如我們在 Python 中所見的那樣:
圖片
然而,slice() 本身并不支持步長,所以我們需要使用一個 for 循環(huán)來快速遍歷數(shù)組:
圖片
圖片
Array.reduce() 以不可變的方式完成了完全相同的任務(wù)。我認(rèn)為,在數(shù)據(jù)轉(zhuǎn)換的過程中,函數(shù)式編程的流動性使得它顯得格外優(yōu)雅。
可讀性受到影響了…
圖片
反向步長
如果我們想要反向遍歷數(shù)組呢?
當(dāng)然 Python 有它:
圖片
在這種情況下,start 應(yīng)該大于 stop,因?yàn)槟闶菑挠蚁蜃笥?jì)數(shù),所以 start 應(yīng)該更大一些。
圖片
我們需要再次調(diào)整 slice() 的使用方式,當(dāng) step 為負(fù)數(shù)時(shí)交換 absStart 和 absEnd:
圖片
slice() 在 end > start 時(shí)會返回一個空數(shù)組,這樣我們就能夠使用它進(jìn)行一些基礎(chǔ)操作。
圖片
綜合實(shí)現(xiàn)
現(xiàn)在,讓我們將所有功能組合在一起:
圖片
圖片
圖片
回顧一下我們是如何開始的:
圖片
這不僅簡化了代碼,而且成功將 Python 中的酷炫數(shù)組切片語法帶入了 JavaScript。
當(dāng)然,代碼中我們還沒有添加對錯誤類型和邊界情況的檢查,花了不少時(shí)間調(diào)試這些問題。如果我們進(jìn)一步添加多維數(shù)組支持,比如 numpy,代碼會變得更加復(fù)雜,但這也是值得嘗試的。
圖片
通過這個新的 Array r() 方法,我們成功地將 Python 的數(shù)組切片語法引入了 JavaScript。