手写数组去重
Set
var uniq = function(arr){
return Array.from(new Set(arr))
}
var nums = [1, 2, 2, 3, 4]
console.log(uniq(nums))
使用 Map
- 声明 map 数据
- for 遍历
- 防御性:undefined 跳出此循环
- 存在:跳出此循环
- 不存在 存入 map.set(num,true)
- 返回map转数组
[map.keys()]
var uniq = function(array){
const map = new Map() // 数据唯一性
for (let i = 0; i < array.length; i++) {
const num = array[i];
// 空白,,:跳出此循环
if(num === undefined){continue}
// 存在:跳出此循环
if(map.has(num)){continue}
// 不存在
map.set(num,true)
}
return [map.keys()]
}
var nums = [1, 2, 2, , 3, 4]
console.log(uniq(nums))
使用计数排序的思路,缺点是只支持字符串
var uniq = function(array){
const map = {}
for (let i = 0; i < array.length; i++) {
const num = array[i];
// 空白:跳出此循环
if(num === undefined){continue}
// 存在:跳出此循环
if(map[num]){continue}
// 不存在
map[num] = true
}
// Object.keys只能变为字符串
const result = []
for (const key in map) {
result.push(parseInt(key))
}
return result
}
var nums = [1, 2, 2, 3, 4]
console.log(uniq(nums))
二维数组去重
相同的 name 和 age 去重
var oldArr = [
{name:1,age:1},
{name:2,age:2},
{name:2,age:2},
{name:3,age:3},
{name:3,age:4},
{name:4,age:5},
{name:4,age:4},
{name:4,age:0},
{name:5,age:6},
{name:5,age:6},
{name:1,age:0},
{name:1,age:0},
{name:2,age:0},
{name:3,age:0},
{name:1,age:0},
];
const obj = {};
for(const item of oldArr){
obj[item.name+','+item.age] = item
}
oldArr = Object.values(obj)
console.log(oldArr) //现在就得到大家想要的结果了。
相同的 name 去重
var oldArr = [
{name:1,age:1},
{name:2,age:2},
{name:2,age:2},
{name:3,age:3},
{name:3,age:4},
{name:4,age:5},
{name:4,age:4},
{name:4,age:0},
{name:5,age:6},
{name:5,age:6},
{name:1,age:0},
{name:1,age:0},
{name:2,age:0},
{name:3,age:0},
{name:1,age:0},
];
const obj = {};
oldArr = oldArr.reduce((pre,cur)=>{
obj[cur.name] ? '' : obj[cur.name] = true && pre.push(cur)
return pre;
},[])
console.log(oldArr) //搞定
数组嵌套去重
var arr = [["aa","bb","cc"],["aa","bb","cc"],["b","b","v"]];
var hash = {};
var result = [];
for(var i = 0, len = arr.length; i < len; i++){
if(!hash[arr[i]]){
hash[arr[i]] = true;
result.push(arr[i]);
}
}
console.log(result);