記錄市面上的全部去重複方法(JS)javascript
思路:設置一個空對象和一個空的新數組, 遍歷整個數組,若是對象存在則不向新空數組push數據,不然就向空對象添加以這個數組值爲key的對象,且push到新數組中,這樣最後獲得的就是一個已經去除重複的新數組了。java
/**
*@arr 爲 [1,2,3,x,x,x,...]
*輸出 [1,2,3,...]
*/
function uniqueEasy(arr){
// 判斷arr是否爲數組
if(!Array.isArray(arr)){
console.log('type error!')
return
}
let list = []
let obj = {}
arr.forEach(v=>{
if(!obj[v]){
obj[v] = true
list.push(v)
}
})
return list
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefined, null,null, NaN, NaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
console.log(uniqueEasy(arr))
// [1, true, false, "string", undefined, null, NaN, {…}, Array(0), Array(1), ƒ, Sat Feb 01 2020 16:31:20 GMT+0800 (中國標準時間), Symbol(), Symbol()] // {}與{a:1}都變成了第一個對象{},Symbol判斷不了
複製代碼
沒法去掉「{}」空對象es6
function uniqueEs6(arr){
return [...new Set(arr)]
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefined, null,null, NaN, NaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
console.log(uniqueEs6(arr))
// [1, true, false, "string", undefined, null, NaN, {…}, {…}, {…}, {…}, Array(0), Array(0), Array(1), Array(1), ƒ, ƒ, Sat Feb 01 2020 16:27:20 GMT+0800 (中國標準時間), Sat Feb 01 2020 16:27:20 GMT+0800 (中國標準時間), Symbol(), Symbol()] // 對象、數組、函數、時間、Symbol都判斷不了
複製代碼
思路:遍歷數組後過濾出索引等於第一次出現的索引
沒法去掉重複的「{}」空對象,由於 arr.indexOf({}) 找不到web
function uniqueFilter(arr){
return arr.filter((el,i,oldArr)=>oldArr.indexOf(el)===i)
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefined, null,null, NaN, NaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
console.log(uniqueFilter(arr))
// [1, true, false, "string", undefined, null, {…}, {…}, {…}, {…}, Array(0), Array(0), Array(1), Array(1), ƒ, ƒ, Sat Feb 01 2020 16:37:36 GMT+0800 (中國標準時間), Sat Feb 01 2020 16:37:36 GMT+0800 (中國標準時間), Symbol(), Symbol()] // 對象、數組、函數、時間、Symbol都判斷不了
複製代碼
function uniqueReduce(arr){
return arr.reduce((prev,cur) => prev.includes(cur) ? prev : [...prev,cur],[]);
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefined, null,null, NaN, NaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
console.log(uniqueReduce(arr))
// [1, true, false, "string", undefined, null, NaN, {…}, {…}, {…}, {…}, Array(0), Array(0), Array(1), Array(1), ƒ, ƒ, Sat Feb 01 2020 19:02:39 GMT+0800 (中國標準時間), Sat Feb 01 2020 19:02:39 GMT+0800 (中國標準時間), Symbol(), Symbol()] // 對象、數組、函數、時間、Symbol都判斷不了
複製代碼
該方法也沒法去掉重複的「{}」空對象數組
function uniqueEs5(arr){
for(let i=0; i<arr.length; i++){
for(let j=i+1; j<arr.length; j++){
if(arr[i]===arr[j]){
arr.splice(j,1);
j--;
}
}
}
return arr;
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefined, null,null, NaN, NaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
console.log(uniqueEs5(arr))
// [1, true, false, "string", undefined, null, NaN, NaN, {…}, {…}, {…}, {…}, Array(0), Array(0), Array(1), Array(1), ƒ, ƒ, Sat Feb 01 2020 16:43:04 GMT+0800 (中國標準時間), Sat Feb 01 2020 16:43:04 GMT+0800 (中國標準時間), Symbol(), Symbol()] // NaN、對象、數組、函數、時間、Symbol都判斷不了
複製代碼
function uniqueIndexOf(arr) {
if (!Array.isArray(arr)) {
console.log('type error!')
return
}
let array = [];
for (let i = 0; i < arr.length; i++) {
if (array.indexOf(arr[i]) === -1) {
array.push(arr[i])
}
}
return array;
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefined, null,null, NaN, NaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
console.log(uniqueIndexOf(arr))
// [1, true, false, "string", undefined, null, NaN, NaN, {…}, {…}, {…}, {…}, Array(0), Array(0), Array(1), Array(1), ƒ, ƒ, Sat Feb 01 2020 16:45:44 GMT+0800 (中國標準時間), Sat Feb 01 2020 16:45:44 GMT+0800 (中國標準時間), Symbol(), Symbol()] // NaN、對象、數組、函數、時間、Symbol都判斷不了
複製代碼
function uniqueSort(arr) {
if (!Array.isArray(arr)) {
console.log('type error!')
return;
}
arr = arr.sort()
let arrry= [arr[0]];
for (let i = 1; i < arr.length; i++) {
if (arr[i] !== arr[i-1]) {
arrry.push(arr[i]);
}
}
return arrry;
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefined, null,null, NaN, NaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date()]
console.log(uniqueSort(arr))
// [Array(0), Array(0), Array(1), Array(1), 1, NaN, NaN, Sat Feb 01 2020 17:14:26 GMT+0800 (中國標準時間), Sat Feb 01 2020 17:14:26 GMT+0800 (中國標準時間), {…}, {…}, {…}, {…}, false, ƒ, ƒ, null, "string", true, undefined] // NaN、對象、數組、函數、時間都判斷不了
複製代碼
function uniqueIncludes(arr) {
if (!Array.isArray(arr)) {
console.log('type error!')
return
}
let array =[];
for(let i = 0; i < arr.length; i++) {
if( !array.includes( arr[i]) ) {//includes 檢測數組是否有某個值
array.push(arr[i]);
}
}
return array
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefined, null,null, NaN, NaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
console.log(uniqueIncludes(arr))
// [1, true, false, "string", undefined, null, NaN, {…}, {…}, {…}, {…}, Array(0), Array(0), Array(1), Array(1), ƒ, ƒ, Sat Feb 01 2020 17:32:46 GMT+0800 (中國標準時間), Sat Feb 01 2020 17:32:46 GMT+0800 (中國標準時間), Symbol(), Symbol()] // 對象、數組、函數、時間、Symbol都判斷不了
複製代碼
function uniqueHasOwnProperty(arr) {
let obj = {};
return arr.filter(function(item, index, arr){
return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
})
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefined, null,null, NaN, NaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date()]
console.log(uniqueHasOwnProperty(arr))
// [1, true, false, "string", undefined, null, NaN, {…}, Array(0), Array(1), ƒ, Sat Feb 01 2020 17:43:39 GMT+0800 (中國標準時間)] // 對象判斷不了
複製代碼
升序->從最後一個開始向前對比,若是出現重複就刪除app
function uniqueLoop(arr) {
let array= arr;
let len = array.length;
array.sort(function(a,b){ // 排序後更加方便去重
return a - b;
})
function loop(index){
if(index >= 1){
if(array[index] === array[index-1]){
array.splice(index,1);
}
loop(index - 1); // 遞歸loop,而後數組去重
}
}
loop(len-1);
return array;
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefined, null,null, NaN, NaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date()]
console.log(uniqueLoop(arr))
// [false, null, 1, true, "string", NaN, NaN, {…}, {…}, {…}, {…}, Array(0), Array(0), Array(1), Array(1), ƒ, ƒ, Sat Feb 01 2020 18:41:15 GMT+0800 (中國標準時間), Sat Feb 01 2020 18:41:15 GMT+0800 (中國標準時間), undefined] // NaN、對象、數組、函數、時間都判斷不了
複製代碼
function uniqueMap(arr) {
let map = new Map();
let array = new Array(); // 數組用於返回結果
for (let i = 0; i < arr.length; i++) {
if(map.has(arr[i])) { // 若是有該key值
map.set(arr[i], true);
} else {
map.set(arr[i], false); // 若是沒有該key值
array.push(arr[i]);
}
}
return array ;
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefined, null,null, NaN, NaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
console.log(uniqueMap(arr))
// [1, true, false, "string", undefined, null, NaN, {…}, {…}, {…}, {…}, Array(0), Array(0), Array(1), Array(1), ƒ, ƒ, Sat Feb 01 2020 18:55:44 GMT+0800 (中國標準時間), Sat Feb 01 2020 18:55:44 GMT+0800 (中國標準時間), Symbol(), Symbol()] // 對象、數組、函數、時間、Symbol都判斷不了
複製代碼
// 輸入 [1,1,true,true,false,false,'string','string',undefined,undefined, null,null, NaN, NaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
// 輸出 [1,true,false,'string',undefined,null, NaN,{},{a:1},[],[0],function(){}, Sat Feb 01 2020 18:55:44 GMT+0800 (中國標準時間),Symbol()]
複製代碼
要怎麼作呢? 函數
function unique(arr){
// 判斷arr是否爲數組
if(!Array.isArray(arr)){
console.log('type error!')
return
}
let list = []
let obj = {}
let isUnique = false // 是否惟一
let type = '' // 元素類型
let item = null // 新元素項
arr.forEach(v=>{
temp = ''
type = Object.prototype.toString.call(v)
switch(type){
case '[object Object]':
// 對象 對象不能作爲對象的key值
item = '[object Object]' + JSON.stringify(v)
isUnique = obj[item]
break;
case '[object Symbol]':
// Symbol Symbol不能隱式轉String
item = '[object Symbol]' + v.toString()
isUnique = obj[item]
break;
default:
item = v
isUnique = obj[v]
}
if(!isUnique){
obj[item] = true
list.push(v)
}
})
return list
}
let arr = [1,1,true,true,false,false,'string','string',undefined,undefined, null,null, NaN, NaN,{},{},{a:1},{a:1},[],[],[0],[0],function(){},function(){},new Date(),new Date(),Symbol(),Symbol()]
console.log(unique(arr))
複製代碼