首頁 web前端 js教程 JavaScript中split與join函數的進階使用技巧_javascript技巧

JavaScript中split與join函數的進階使用技巧_javascript技巧

May 16, 2016 pm 03:02 PM
javascript join js split 字串 陣列

Javascript擁有兩個相當強大且受開發者喜愛的函數:split 與join 兩個對立的函數。這兩個函數能讓string與array兩種類型互換,也就是陣列能被序列化為字串,反之亦然。我們能把這倆函數發揮得淋漓盡致。下面就來探索裡面的一些有趣的應用, 首先介紹一下這兩個函數:

String.prototype.split(separator, limit)
separator把字串分割為數組,可選參數limit定義了產生數組的最大length。

"85@@86@@53".split('@@'); //['85','86','53'];
"banana".split(); //["banana"]; //( thanks peter (-: )
"president,senate,house".split(',',2); //["president", "senate"]
Array.prototype.join(separator)
登入後複製

可選參數separator把陣列轉換為一個字串。如果不提供separator,那麼就會把逗號做為這個參數值(就跟陣列的toString函數一樣)。

["slugs","snails","puppy dog's tails"].join(' and '); //"slugs and snails and puppy dog's tails"
['Giants', 4, 'Rangers', 1].join(' '); //"Giants 4 Rangers 1"
[1962,1989,2002,2010].join();
登入後複製

下面來看這些應用:

replaceAll
這個簡單的函數不像原生的replace函數,它能作為一個全域的子字串替換而不需要使用正規表示式。

String.prototype.replaceAll = function(find, replaceWith) {
  return this.split(find).join(replaceWith); 
}

"the man and the plan".replaceAll('the','a'); //"a man and a plan"

登入後複製

對於小的字串,它比單個字元替換的原生函數性能要弱一些(這裡指的是正則表達式的兩個額外的函數),但是在mozilla下,如果這個字元超過2個或3個字元話,這種使用函數要比正規表示式運行得更快。

occurences
此函數能取到子字串匹配的個數。而且這種函數很直接不需要正規。

String.prototype.occurences = function(find, matchCase) {
  var text = this;
  matchCase || (find = find.toLowerCase(), text = text.toLowerCase());
  return text.split(find).length-1;  
}

document.body.innerHTML.occurences("div"); //google home page has 114
document.body.innerHTML.occurences("/div"); //google home page has 57
"England engages its engineers".occurrences("eng",true); //2
repeat

登入後複製

函數是從prototype.js 借鏡而來:

String.prototype.repeat = function(times) {
  return new Array(times+1).join(this);  
}

"go ".repeat(3) + "Giants!"; //"go go go Giants!"

登入後複製

它的美妙之處就在於join函數的使用。焦點就在這個separator參數值,然後這個基礎陣列就只包含了一些未定義的value值。為了更清楚的說明這一點,我們來重造一下上面的實例:

[undefined,undefined,undefined,undefined].join("go ") + "Giants
登入後複製

記得在join之前每個陣列元素都會轉換成一個字串(這裡就是一個空字串)。這個repeat函數的應用是透過陣列字面量定義數組的為數不多的不可行的應用。

使用limit參數
我很少使用split函式的limit可選參數,以下介紹一個使用這個limit的實例:

var getDomain = function(url) {
  return url.split('/',3).join('/');
}

getDomain("http://www.aneventapart.com/2010/seattle/slides/");
//"http://www.aneventapart.com"
getDomain("https://addons.mozilla.org/en-US/firefox/bookmarks/");
//"https://addons.mozilla.org"

登入後複製

修改數值成員
如果我們將正規混合起來使用,join,split就能很容易的修改數組成員了​​。但這個函數也沒有想像的難,它的主要功能是去掉給定陣列的每個member前面指定的字串。

var beheadMembers = function(arr, removeStr) {
  var regex = RegExp("[,]?" + removeStr);
  return arr.join().split(regex).slice(1);
}

//make an array containing only the numeric portion of flight numbers
beheadMembers(["ba015","ba129","ba130"],"ba"); //["015","129","130"]

登入後複製

不幸的是,這種函數在IE中失效,因為他們從split中錯誤的去掉了第一個空成員。現在來修正這種函數:

var beheadMembers = function(arr, removeStr) {
  var regex = RegExp("[,]?" + removeStr);
  var result = arr.join().split(regex);
  return result[0] && result || result.slice(1); //IE workaround
}
登入後複製

我們為什麼要用這個技巧而不用Emascript 5 中array 的map函數呢?

["ba015","ba129","ba130"].map(function(e) {
  return e.replace('ba','')
}); //["015","129","130"] 
登入後複製

在實際的運用中,在可行的時候,我通常會使用原生的map函數(在IE<9 以下不可用)。以下的例子只是作為學習的工具,但值得注意的是,join與split的呼叫語法更簡潔更直接一些。最有趣的是,它也非常高效,尤其是對於很小的數組,在FF與Safari中它表現為更為高效。對於大數組來說,map函數就比較適合一些。 (在所有的瀏覽器中),join與split函數的函式呼叫會少一些。

//test 1 - using join/split
var arr = [], x = 1000;
while (x--) {arr.push("ba" + x);}

var beheadMembers = function(arr, regex) {
  return arr.join().split(regex).slice(1);
}

var regex = RegExp("[,]&#63;" + 'ba');
var timer = +new Date, y = 1000;
while(y--) {beheadMembers(arr,regex);};
+new Date - timer;

//FF 3.6 733ms
//Ch 7  464ms
//Sa 5  701ms
//IE 8 1256ms

//test 2 - using native map function
var arr = [], x = 1000;
while (x--) {arr.push("ba" + x);}

var timer = +new Date, y = 1000;
while(y--) {
  arr.map(function(e) {
    return e.replace('ba','')
  });
}
+new Date - timer;

//FF 3.6 2051ms
//Cr 7  732ms
//Sf 5  1520ms
//IE 8  (Not supported)

登入後複製

模式匹配
數組需要不斷的去執行模式匹配,但是字串不會。正規表示式能在字串中運用,但是在陣列中不會。把數組轉為字串用於模式匹配的強悍之處遠遠超越這篇文章所述的範圍。讓我們來看看它的一個簡單應用。

假設競走的比賽結果需要保存到陣列中。目的是將競賽者與他們的記錄時間交替的放在數組中。我們可以用join與正規表示式來驗證這種儲存模式是否正確。下面的程式碼就是透過找出兩個連續的名字來找出記錄時間被遺漏的情況。

var results = ['sunil', '23:09', 'bob', '22:09', 'carlos', 'mary', '22:59'];
var badData = results.join(',').match(/[a-zA-Z]+,[a-zA-Z]+/g);
badData; //["carlos,mary"]
登入後複製

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用 foreach 迴圈移除 PHP 陣列中的重複元素? 如何使用 foreach 迴圈移除 PHP 陣列中的重複元素? Apr 27, 2024 am 11:33 AM

使用foreach循環移除PHP數組中重複元素的方法如下:遍歷數組,若元素已存在且當前位置不是第一個出現的位置,則刪除它。舉例而言,若資料庫查詢結果有重複記錄,可使用此方法移除,得到不含重複記錄的結果。

PHP數組深度複製的藝術:使用不同方法完美複製 PHP數組深度複製的藝術:使用不同方法完美複製 May 01, 2024 pm 12:30 PM

PHP中深度複製數組的方法包括:使用json_decode和json_encode進行JSON編碼和解碼。使用array_map和clone進行深度複製鍵和值的副本。使用serialize和unserialize進行序列化和反序列化。

PHP 陣列鍵值翻轉:不同方法的效能比較分析 PHP 陣列鍵值翻轉:不同方法的效能比較分析 May 03, 2024 pm 09:03 PM

PHP數組鍵值翻轉方法效能比較顯示:array_flip()函數在大型數組(超過100萬個元素)下比for迴圈效能更優,耗時更短。手動翻轉鍵值的for迴圈方法耗時相對較長。

深度複製PHP數組的最佳實踐:探索高效的方法 深度複製PHP數組的最佳實踐:探索高效的方法 Apr 30, 2024 pm 03:42 PM

在PHP中執行陣列深度複製的最佳實踐是:使用json_decode(json_encode($arr))將陣列轉換為JSON字串,然後再轉換回陣列。使用unserialize(serialize($arr))將陣列序列化為字串,然後將其反序列化為新陣列。使用RecursiveIteratorIterator迭代器對多維數組進行遞歸遍歷。

PHP 數組分組函數在資料整理的應用 PHP 數組分組函數在資料整理的應用 May 04, 2024 pm 01:03 PM

PHP的array_group_by函數可依鍵或閉包函數將陣列中的元素分組,傳回關聯數組,其中鍵為組名,值是屬於該組的元素數組。

PHP數組多維排序實戰:從簡單到複雜場景 PHP數組多維排序實戰:從簡單到複雜場景 Apr 29, 2024 pm 09:12 PM

多維數組排序可分為單列排序和嵌套排序。單列排序可使用array_multisort()函數依列排序;巢狀排序需要遞歸函數遍歷陣列並排序。實戰案例包括按產品名稱排序和按銷售量和價格複合排序。

PHP 數組合併去重演算法:平行的解決方案 PHP 數組合併去重演算法:平行的解決方案 Apr 18, 2024 pm 02:30 PM

PHP數組合併去重演算法提供了平行的解決方案,將原始陣列分成小塊並行處理,主進程合併區塊的結果去重。演算法步驟:分割原始數組為均等分​​配的小塊。並行處理每個區塊去重。合併區塊結果並再次去重。

PHP 陣列分組函數在尋找重複元素中的作用 PHP 陣列分組函數在尋找重複元素中的作用 May 05, 2024 am 09:21 AM

PHP的array_group()函數可用來按指定鍵對陣列進行分組,以尋找重複元素。函數透過以下步驟運作:使用key_callback指定分組鍵。可選地使用value_callback確定分組值。對分組元素進行計數並識別重複項。因此,array_group()函數對於尋找和處理重複元素非常有用。

See all articles