js去除数组重复成员
第一种思路是:遍历要删除的数组arr, 把元素分别放入另一个数组tmp中,在判断该元素在arr中不存在才允许放入tmp中
用到两个函数:for ...in 和 indexOf()
1 <script type="text/javascript"> 2 var student = ['qiang','ming','tao','li','liang','you','qiang','tao']; 3 function unique(arr){ 4 // 遍历arr,把元素分别放入tmp数组(不存在才放) 5 var tmp = new Array(); 6 for(var i in arr){ 7 //该元素在tmp内部不存在才允许追加 8 if(tmp.indexOf(arr[i])==-1){ 9 tmp.push(arr[i]); 10 } 11 } 12 return tmp; 13 } 14 </script>
第二种思路是:把目标数组arr的元素值和键的位置调换 自动就把重复的元素给删除掉了,调换后的样子:array('qiang'=>1,'ming'=>1,'tao'=>1)
1 <script type="text/javascript"> 2 var student = ['qiang','ming','tao','li','liang','you','qiang','tao']; 3 function unique(arr){ 4 var tmp = new Array(); 5 for(var m in arr){ 6 tmp[arr[m]]=1; 7 } 8 //再把键和值的位置再次调换 9 var tmparr = new Array(); 10 for(var n in tmp){ 11 tmparr.push(n); 12 } 13 return tmparr; 14 } 15 </script>
第三种思路是:ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。使用Array.from
方法可以将Set结构转为数组的特性,去除数组重复成员
1 let oldarray = [1,2,3,4,4,5] 2 function RemovingArrayRepeating(array) { 3 return Array.from(new Set(array)); 4 } 5 RemovingArrayRepeating(oldarray )//[1,2,3,4,5]
第四种思路是:利用hasOwnProperty
1 function unique(arr) { 2 var obj = {}; 3 return arr.filter(function (item, index, arr) { 4 return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)//利用hasOwnProperty 判断是否存在对象属性 但是无法判断对象是否相同,直接去重 5 }) 6 }
第五种思路是:利用Map数据结构去重
1 function unique(arr) { 2 let map = new Map(); 3 let array = new Array(); 4 // 数组用于返回结果 5 for (let i = 0; i < arr.length; i++) { 6 if (map.has(arr[i])) { 7 // 如果有该key值 8 map.set(arr[i], true); 9 } else { 10 map.set(arr[i], false); 11 // 如果没有该key值 12 array.push(arr[i]); 13 } 14 } 15 return array;//对象不能去重 16 }
第六种思路是:利用reduce+includes
1 function unique(arr) { 2 return arr.reduce((prev, cur) => prev.includes(cur) ? prev : [...prev, cur], []);//对象不能去重 3 }
第七种思路是:利用filter
1 function unique(arr) { 2 return arr.filter( 3 function (item, index, arr) { 4 //当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素 5 return arr.indexOf(item, 0) === index;//直接把NaN干掉 6 } 7 ); 8 }
第八种思路是:利用includes
1 function unique(arr) { 2 if (!Array.isArray(arr)) { 3 console.log('type error!') 4 return 5 } 6 var array = []; for (var i = 0; i < arr.length; i++) { 7 if (!array.includes(arr[i])) { 8 //includes 检测数组是否有某个值 9 array.push(arr[i]); 10 } 11 12 } 13 return array;//对象不能去重 14 }
第九种思路是:利用sort()
1 function unique(arr) { 2 if (!Array.isArray(arr)) { 3 console.log('type error!') 4 return 5 } 6 arr = arr.sort() 7 var arrry = [arr[0]]; 8 for ( 9 var i = 1; i < arr.length; i++) { 10 if (arr[i] !== arr[i - 1]) { 11 arrry.push(arr[i]); 12 } 13 } 14 return arrry;//NaN 对象不能去重 15 }
第十种思路是:利用对象的属性不能相同的特点进行去重
1 function unique(arr) { 2 var arrry = []; 3 var obj = {}; 4 for (var i = 0; i < arr.length; i++) { 5 if (!obj[arr[i]]) { 6 arrry.push(arr[i]) 7 obj[arr[i]] = 1 8 } else { 9 obj[arr[i]]++ 10 } 11 } 12 return arrry;////'NaN' true 对象不能去重 13 }
第十一种思路是:js根据某字段去重json数组
1 /** 2 * 根据某一字段 去重json数组 3 * @param JsonArray :需要去重的json数组 4 * @param fieldName :根据此字段去重 5 */ 6 export function jsonArrayToFilterByFieldName(JsonArray, fieldName) { 7 let deduplicateJsonArray = []; 8 for (let i = 0; i < JsonArray.length; i++) { 9 let retrieveJson = JsonArray[i]; 10 if (i == 0) { 11 deduplicateJsonArray.push(retrieveJson); 12 } else { 13 let filterData = deduplicateJsonArray.filter(function (item) { 14 return item[fieldName] == retrieveJson[fieldName]; 15 }) 16 if (filterData.length == 0) { 17 deduplicateJsonArray.push(retrieveJson); 18 } 19 } 20 } 21 return deduplicateJsonArray; 22 }