以下內容屬於個人原創,轉載請注明出處,非常感謝!
刪除數組中重復的值或者刪除字符串重復的字符,是我們前端開發人員碰到很多這樣的場景。還有求職者在被面試時也會碰到這樣的問題!比如:問刪除字符串重復的字符,保留其中的一個,並打印出重復的次數。
其實這種問題或者場景,要是針對刪除字符串重復的字符,這個可以用正則表達式實現,那么這個需要Web前端開發人員熟悉正則表達式了,要是針對數組,有的人就會想到,我們可以用jion('')轉成字符串可以用了。但是這種數組要滿足這樣的要求才可以,如:['a','b','c','a','b'],這種是可以的!但是這樣的數組數據,幾乎是可能這樣完美的,尤其是數據的數組。比如:[1,123,3,55,54,56,3,123]或['a','ab','a'],大多數都是這樣的。這樣類型的數組,就不能用正則來弄了!
看了上面的問題,肯定有人會想,能不能寫一個通用的,既能刪除字符串中重復的字符,也能刪除數組中重復的值呢?
恭喜你,找對地方了,在我這里就是一個字有!,但支持到IE9以上標准模式的瀏覽器(IE9、IE10、IE11等這些版本的企業模式不支持),其他的Chrome、火狐等瀏覽器就不要去考慮了,因為肯定支持的
代碼如下(以下代碼用ES6格式寫的):
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的面板):
字符串類型的去重

數組類型的去重:

