以下內容屬於我的原創,轉載請註明出處,很是感謝!前端
刪除數組中重複的值或者刪除字符串重複的字符,是咱們前端開發人員碰到不少這樣的場景。還有求職者在被面試時也會碰到這樣的問題!好比:問刪除字符串重複的字符,保留其中的一個,並打印出重複的次數。面試
其實這種問題或者場景,要是針對刪除字符串重複的字符,這個能夠用正則表達式實現,那麼這個須要Web前端開發人員熟悉正則表達式了,要是針對數組,有的人就會想到,咱們能夠用jion('')轉成字符串能夠用了。可是這種數組要知足這樣的要求才能夠,如:['a','b','c','a','b'],這種是能夠的!可是這樣的數組數據,幾乎是可能這樣完美的,尤爲是數據的數組。好比:[1,123,3,55,54,56,3,123]或['a','ab','a'],大多數都是這樣的。這樣類型的數組,就不能用正則來弄了!正則表達式
看了上面的問題,確定有人會想,能不能寫一個通用的,既能刪除字符串中重複的字符,也能刪除數組中重複的值呢?數組
恭喜你,找對地方了,在我這裏就是一個字有!,但支持到IE9以上標準模式的瀏覽器(IE九、IE十、IE11等這些版本的企業模式不支持),其餘的Chrome、火狐等瀏覽器就不要去考慮了,由於確定支持的
瀏覽器
代碼以下(如下代碼用ES6格式寫的):ide
1 let getRemoveRepeat = (obj, flag) => { 2 if (typeof obj === 'undefined') return '傳入\"abcab\"或\[\"a\"\,\"b\"\,\"a\"\]'; 3 let str, _map = {}, arr = [], mod = 0; 4 flag = typeof flag === 'undefined' ? false : flag; 5 if (obj.constructor === Array) str = obj; 6 else if (obj.constructor === String) { 7 mod = 1; 8 str = obj.split(''); 9 } 10 str.map(x => { 11 // 當flag是true,意思就是不區分大小寫 好比A和a都要只保留一個,默認區分的 12 if(flag && typeof x ==='string') x =x.toLocaleLowerCase(); 13 if (!_map[x]) { 14 _map[x] = 1; //次數爲1 15 arr.push(x); 16 } 17 else _map[x] = _map[x] + 1; 18 }); 19 console.log(_map); //打印出每一個值的重複次數 20 return mod ? arr.join('') : arr; 21 }
下面是轉換成ES5的代碼(IE9以上包括IE9在內的標準模式可能夠):測試
1 'use strict'; 2 var getRemoveRepeat = function getRemoveRepeat(obj, flag) { 3 if (typeof obj === 'undefined') return '傳入\"abcab\"或\[\"a\"\,\"b\"\,\"a\"\]'; 4 var str = void 0, 5 _map = {}, 6 arr = [], 7 mod = 0; 8 flag = typeof flag === 'undefined' ? false : flag; 9 if (obj.constructor === Array) str = obj;else if (obj.constructor === String) { 10 mod = 1; 11 str = obj.split(''); 12 } 13 str.map(function (x) { 14 // 當flag是true,意思就是不區分大小寫 好比A和a都要只保留一個,默認區分的 15 if (flag && typeof x === 'string') x = x.toLocaleLowerCase(); 16 if (!_map[x]) { 17 _map[x] = 1; //次數爲1 18 arr.push(x); 19 } else _map[x] = _map[x] + 1; 20 }); 21 console.log(_map); //打印出每一個值的重複次數 22 return mod ? arr.join('') : arr; 23 };
下面是測試用例的截圖(基於Chrome瀏覽的Console的面板):spa
字符串類型的去重3d
數組類型的去重:code