文章目錄
  1. 1. 所謂字串
  2. 2. 字串變陣列的玩法
    1. 2.1. 字串玩法 1
    2. 2.2. 字串玩法 2
  3. 3. 陣列變字串的玩法
    1. 3.1. 陣列玩法 1
    2. 3.2. 陣列玩法 2
  4. 4. 結論

字串和陣列,是很重要且基本的兩個型別,但、為什摸會想把他們擺一起呢?是因為、他們之間有非常有趣的關係。然後、另外打算附上個我個人愛用,但可能有點冷門的使用方式啦~!

所謂字串

直接就開始玩 js 的人類們,可能會無感,或者不太重視型別的語言也可能無感。不過、寫程式的大部份應該都要有感啦~!所謂的字串、就是 字元陣列 ,寫 c/c++ 的時候,書上會說有一種 type 叫做 char 但尼找不到 string~ T UT

1
2
char c; // 字元
char s[20]; // 字串、字元陣列

在…. haskell 裡

1
['a', 'b', 'c'] == "abc" // true

眾多的跡象都表示了,字元陣列就相當於字串,而字串這種形式、應該算是個 sugar 啦~!而這也就代表了~ 只要將字串轉為字元陣列,那就會有陣列的某些特型了。(所以、有沒有發現 js 的 String 的 method 跟 Array 的重複性好高!)

不過、接下來還是以 js 為主啦~ T UT 以前熟悉的語言現在有點陌生,然後、有些語言又才開始玩~ 為了不誤人子弟,還是就用 js 舉例囉!

字串變陣列的玩法

開始之前當然是要先轉成陣列啦~

1
2
var str = 'abcdefg';
str = str.split(''); // ['a', 'b', 'c', 'd', 'e']

字串玩法 1

其實、字串轉陣列,除非字串有某些規則啦~ 要不、沒有那摸好玩!但、簡單的玩下加解密還是可以的。就是簡單的用個算式,然後來個 loop 啪的算完得到加密結果。(但這、蠻無聊的啦~)

字串玩法 2

對於有意義的字串,比如:名字字組。可以排序什摸的、也可以 filter 啦~ 所有 array 可以用的 method 就都可以用了。但、前提是有規律啦~!

1
2
3
var editors = 'atom,vim,sublime,emacs,notepad++';
editors.split(',').sort((a, b) => a.localeCompare(b));
// ['atom', 'emacs', 'notepad++', 'sublime', 'vim']

陣列變字串的玩法

其實、我遇到的問題,絕大部份都是陣列啦~ 因為、一般來說,字串通常都是有意義的,像是名字這類的。想要遇到字串玩法 2其實沒有那摸容易。

js 轉換各種型別其實真的蠻容易的,陣列變字串是我愛用的方法之一。也許大家會疑惑歐!陣列、尼轉成字串是要幹嘛啦~!有意義嗎?不管是煎煮炒炸、陣列都已經很方便用了誒,只要來個 for loopif-else ,再不然、現在的陣列也有 filterforEachmap 什摸的、都很好用了呀~!

對、現在的 Array 擁有的 method 已經很多了啦~ 但、我覺得要寫很多啊~ 我不喜歡寫那摸多,有點累….。不過、推薦的陣列,還是以單純的,像字串陣列數字陣列會比較好用。

陣列玩法 1

尋找存在,這是我們很常用的一種判斷,就想知道我對象有沒有在陣列裡面,有的話要幹嘛、沒有又要幹麻。就是個常見到不行情況。

一般大概會這樣做… 吧?再或者真的不知道 indexOf ,可能就真的用 loop ,也許、還會用 filter ,但好像還是 indexOf 比較方便啦!

1
2
3
var editorArray = ['atom', 'emacs', 'notepad++', 'sublime', 'vim'];
var x = 'emacs';
var isExist = editorArray.indexOf(x) > -1; // true

字串方式、需要搭配 regexp 服用。(請不要害怕 regexp、regexp 真的是世界上無敵好用的存在之一)

1
2
3
4
var editorArray = ['atom', 'emacs', 'notepad++', 'sublime', 'vim'];
var x = 'emacs';
(new Regexp(`,${x},`)).test(`,${editorArray.join}`) // true

說到這裡、好像也沒啥必要轉成 string 啊! indexOf 都這摸好用了捏。尼那啥 regexp,用起來好複雜捏!但、我認為他的語意比起 indexOf 要明確多了,什摸 indexOf 還要大於 -1。然後、只是判斷存不存在,也不需要用 match ,我花現很多人都很愛用 match ,但、其實只是想知道存不存在而已,一點也沒有必要 match 吧?在這邊推薦 test

陣列玩法 2

在這邊、推薦陣列轉字串再搭配 regexp 的另一個原因是,大多數情況、已經用到了陣列,一定常常要 pushpop 這類的操作,為了保持不重複資料,時不時的檢查,對我來說、這是件很麻煩的事情。這情境大概是這樣….

1
2
3
4
5
6
7
8
9
10
11
def add(item)
if item in list
break
else
push item to list
def remove(item)
if item in list
remove from list
else
break

可想而知、假如在 add 沒有 check ,那、很可能最後的資料會重複歐!經過一連串操作。然後、中間可能還會經過更多其他複雜的操作, indexOf 是可以啦~ 不過、他其實就是從頭開始找到… 看是有沒有找到啦!我不認為在資料多、操作複雜、又只能找到一個的情況下,這種寫法是划算的,而且、我真的很不喜歡語意不明。(直白的說,我就是不喜歡 indexOf 啦~)

所以、我大概都這樣寫。

1
2
3
4
5
6
7
8
9
10
11
function add (list, item) {
(new Regexp(`,${item},`)).test(`,${list.join},`) && list.push(item); // <- 自從會 lint error 就不能這樣寫了!
return list;
};
function remove (list, item) {
return `,${list.join()},`
.replace(new Regexp(`,${item},`, 'g'), ',') // 用 regexp 刪掉 item
.split(',') // 重新變成 array
.slice(1, -1); // 取 1 ~ -1 區間
}

這種 remove 的方式雖然看起來比其他方式麻煩很多,但… 勝在尼有多少個、他就幫尼取代掉多少個啊!!!(實在是因為我被陰了很多次啦~) 後來都採取這種做法來移除陣列裡的東西居多。要做 unique 也好做很多啦~!一堆 loop 根本地獄!

甚至、整個 function 就幾乎是以 string 在操作,一直到最後面,需要改回陣列,才會把它轉換成陣列,實在是因為搭配正則太好用了。正則根本就是判斷的救贖~!

結論

其實真的有那摸一點旁門左道啦~!也不止一次有人問我某段程式在幹麻了,可是、真的好用啊~ T UT 雖然可能不是那摸直觀,但、勝在可以少打很多字、沒有很多的 loop ,程式還可以短上一大截,效能可能有好一些,所以、我完全可以接受只是語意有點不值關啦~!但、我已經習慣了、所以、對我來說很直觀….(<– 超壞)

文章目錄
  1. 1. 所謂字串
  2. 2. 字串變陣列的玩法
    1. 2.1. 字串玩法 1
    2. 2.2. 字串玩法 2
  3. 3. 陣列變字串的玩法
    1. 3.1. 陣列玩法 1
    2. 3.2. 陣列玩法 2
  4. 4. 結論