-
Notifications
You must be signed in to change notification settings - Fork 66
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
实现一个数组去重的方法 #31
Comments
1、ES6中新增了数据类型set,set的一个最大的特点就是数据不重复。Set函数可以接受一个数组(或类数组对象)作为参数来初始化,利用该特性也能做到给数组去重。
}
}
} |
// 第一种方式
var arr = [1, 2, 2, 4, 1, 5, 8, 10];
var newArray = [...new Set(arr)];
// 第二种
var arr = [1, 2, 2, 4, 1, 5, 8, 10];
var newArray = [];
for (let i = 0; i < arr.length; i++) {
let one = arr[i];
if(newArray.indexOf(one)<0){
newArray.push(one);
}
} |
数组去重我了解到两种方法set方法(简单粗暴)
第二种,推入新数组并判断key是否存在
应该还有很多,暂时想到这些,先工作了,一会看大佬操作. |
1: 最简单数组去重法
2: set 对象
3: 先排序后相邻去除法
4: 数组下标法
5: 利用对象属性存在的特性,如果没有该属性则存入新数组。
6: 利用数组原型对象上的includes方法
7: 利用数组原型对象上的 filter 和 includes方法
8: 利用数组原型对象上的 forEach 和 includes方法。
|
1.根据索引去重 |
实现一个数组去重的方法方法一: new Setfunction uniqueArr(array) {
return [...new Set(array)]
}
let arr = [1,2,2,3,3,4,5,6]
uniqueArr(arr) 方法二: 普通方法function uniqueArr(array) {
let temp = [];
for(let i = 0, len = array.length; i < len; i++) {
if(temp.indexOf(array[i]) === -1) {
temp.push(arr[i])
}
}
return temp;
}
let arr = [1,2,2,3,3,4,5,6]
uniqueArr(arr) |
测试模板
第一种方法,效率最低,双循环
第二种方法
第三种
第四种
第五种
|
方法一: 使用ES6中的 Set() 方法 // 这里使用扩展运算符 ... 讲 Set 结构数据转换成数组
var delRepetition = function (arr) {
return [...new Set(arr)];
}
// 也可以使用 ES6 中的 Array.from() 转换成数组
var delRepetition = function (arr) {
return Array.from(new Set(arr));
} 使用该方法比较的直观容易理解,唯一需要注意的是兼容性即可。
方法二:使用内置函数
判断当先元素的下标是否等于查询结果的下标,如果是,则表示第一次出现,如果非表示重复出现。可以借助于 // 如果下标为当前元素下标,表示第一次出现
// 可以直接放入新的数组当中
var delRepetition = function (arr) {
let isN = false;
let newArr = arr.filter((currentValue, index, array) => {
// 判断当前元素是否为 NaN
// 可根据自己的需要删减
if (currentValue !== currentValue) isN = true;
return array.indexOf(currentValue) === index
})
// 如果包含有NaN元素,最后在添加上
if (isN) {
newArr.push(NaN);
}
return newArr;
} 该方法中包含了特殊类型 var delRepetition = function (arr) {
let isN = false;
let newArr = arr.reduce((total, currentValue) => {
if (currentValue !== currentValue) {
isN = true;
} else {
total.indexOf(currentValue) === -1 && total.push(currentValue);
}
return total;
}, []);
if (isN) newArr.push(NaN);
return newArr;
} 方法三:新数组元素查询 查询元素是否存在需要进行循环遍历,可以使用 var delRepetition = function (arr) {
let newArr = [],
isN = false;
for (let v of arr) {
if (v !== v) {
isN = true;
continue;
}
if (!newArr.includes(v)) {
newArr.push(v);
}
}
if (isN) newArr.push(NaN);
return newArr;
} 方法四:排序先对元素排序,然后再对比插入: var delRepetition = function (arr) {
let sArr = [].concat(arr).sort();
let newArr = [],
isN = false;
sArr.forEach((value, index, cArr) => {
if (value !== value) {
isN = true;
} else if (index === 0 || value !== cArr[index - 1]) {
// 如果是第一项,则直接插入
// 后一项不等于前一项,则插入后一项内容
newArr.push(value);
}
});
if (isN) newArr.push(NaN);
return newArr;
} 以上方法都进行过实际测试,测试的内容如下,返回结果除元素顺序不一致外,其他雷同。 delRepetition([
1, '1', 2, null, null, undefined, undefined,
'undefined', NaN, , NaN, 'NaN', 'null', 'true',
true, true, false, , false, 'false', ' ', '' ]);
// => [1, "1", 2, null, undefined, "undefined", NaN, "NaN", "null", "true", true, false, "false", " ", ""] |
|
1.使用set()方法
遍历对象去重(参照上面大佬) 思路 声明空对象 遍历数组 利用Object.keys(赋值) 重复的会覆盖 最后object.values() 取得数组值
|
数组去重
但当数组元素是引用类型的时候,则无法去重
|
// 方法一 // 方法二 // 方法三 // 方法四 function unique4(arr) { for(var i = 0; i < arr.length; i++){ return arr1 |
1.es6 的 Array.from(new Set(arr)) 2.利用 arr = [1,2,3,4,4,3,2,1]
let result = [];
for(const item of arr){
if(!result.includes(item)){
result.push(item);
}
}
arr.sort((a,b)=>a-b);
let result =[];
for(const item of arr){
if(result.indexOf(item)===-1){
result.push(item);
}
} |
new Setvar arr = [1,2,3,4,4,5,6,3,3,1]
[...new Set(arr)] // [1, 2, 3, 4, 5, 6] Array.filtervar arr = [1,2,3,4,4,5,6,3,3,1]
var newArr = arr.filter( (item, index, arr) => {
return index === arr.indexOf(item)
}) // [1, 2, 3, 4, 5, 6] Object.keys根据对象的key不重复的特性来实现 var arr = [1,2,3,4,4,5,6,3,3,1]
var o = {}
arr.forEach(e => o[e] = 1) // 随意赋值一个
var newArr = Object.keys(o).map(Number) // [1, 2, 3, 4, 5, 6] 循环过滤存储var arr = [1,2,3,4,4,5,6,3,3,1]
var s = [];
//遍历数组
for(var i = 0;i<arr.length;i++){
if(s.indexOf(arr[i]) == -1){ //判断在s数组中是否存在,不存在则push到s数组中
s.push(arr[i]);
}
}
console.log(s) // [1, 2, 3, 4, 5, 6] |
#数组去重 大方向啊,先考虑非嵌套数组去重。 然后拓展题, 尝试一下先写测试的函数: const test = (fn, arg, result) => {
// 绝对是一个新的思路呢
}
// 解:
// em....我们可以使用, ES6的set
const unit1 = arr => {
return new Set(arr);
}
unit1([1, 2, 3, 1]);
//em....reduce.
const unit2 = arr => {
return arr.reduce((result, item) => {
result.includes(item) ? result : result.push(item);
return result;
}, [])
}
unit2([1, 2, 3, 1, NaN, NaN, -0, 0, +0, null, null]);
// em....map, 感觉和reduce一样一样的, 不写了。
// em....for.
const unit3 = arr => {
const result = []
arr.map(item => {
result.includes(item) ? void 0: result.push(item);
});
return result;
}
unit3([1, 2, 3, 1, NaN, NaN, -0, 0, +0, null, null]);
// em...对象的key值不能重复可以利用一下.
const unit4 = arr => {
let result = [];
let obj = {};
arr.map(item => {
obj[item] = null;
})
for(i in obj) {
result.push(i)
}
return result;
}
unit4([1, 2, 3, 1, NaN, NaN, -0, 0, +0, null, null]); 往深的看,嵌套数组去重.往深了走.
那么子问题是, 如何判断一个对象是不是相同. 数组其实就递归使用上面的方法就好呀. 但是再往深的看,其实这里如果自己写判断相等的函数还是涉及到一些坑, 比如类型。js的类型判断有几个坑, 比如-0, NaN, 所以我墙裂推荐大家使用数组的includes方法,它本身的实现已经考虑到js变态的类型机制了。当然你完全可以自己写判断两个元素是否相等的函数, 这绝对没问题. 额, 看来大家的答案, 有实现很酷的算法。好羡慕大佬啊, 算法还有算法导论都是好书,垫桌子真的很棒... |
数组下标法遍历需要去重的数组,如果当前数组的某个元素是第一次出现,则存入新的数组,否则忽略掉。 let unique = function (arr) {
let temp = []
arr.forEach((item, index) => {
if (temp.indexOf(item) === -1) {
temp.push(item)
}
})
return temp
} ES6中的Setlet unique = function (arr) {
return [...new Set(arr)]
} 根据对象的键的不重复性let unique = function (arr) {
let obj = {}
arr.forEach(item => obj[item] = item)
return Object.keys(obj) // 这里会导致类型被转换(原本是number型的,转成了string类型)
} ES6中的Map和Set联合使用let unique = function (arr) {
const map = new Map()
return arr.filter(item => !map.has(item) && map.set(item, 1))
} |
法1: 利用ES6新增数据类型
|
const Arr = [1,2,3,4,5,5,5,8,7,4,1,2,3,6,10,10,10,'10','10'];
const uniqueArr = Arr.sort((a,b) => a - b ).filter((e,i,a) => a[i] !== a[i - 1]);
console.log(uniqueArr ); const Arr = [1,2,3,4,5,5,5,8,7,4,1,2,3,6,10,10,10,'10','10'];
const uniqueArr = Array.from(new Set(Arr));
console.log(uniqueArr ); |
3.map去重
|
1.利用setfunction removeDuplicates(arr) {
return Array.from(new Set(arr));
} 空间复杂度: O(n) 2.排序function removeDuplicates(arr) {
arr.sort(function(a, b) {
return a - b;
});
let i = 0;
let j = 1;
while (j < arr.length) {
if (arr[j] !== arr[i]) {
i++;
arr[i] = arr[j];
}
j++;
}
arr.splice(i + 1);
return arr;
} 时间复杂度: O(nlogn) |
方式一 Set去重
方式二 indexOf
方式三 先排序在去重
方式四 利用filter和includes
方式五 利用对象属性方法
|
简单的数组去重 // 利用Set对象
let arr = [1,2,3,4,5,5,6,null,null,undefined];
console.log(...new Set(arr));
// 利用Map对象
function unique(arr) {
const arrMap = new Map();
return arr.filter(item=> !arrMap.has(item) && arrMap.set(item,1))
}
let arr = [1,2,3,4,5,5,6,null,null,undefined];
console.log(unique(arr));
// 利用indexof
function unique(arr) {
let uniqueArr = [];
arr.forEach((item,index) =>{
if(uniqueArr.indexOf(item) === -1){
uniqueArr.push(item);
}
})
return uniqueArr;
}
let arr = [1,2,3,4,5,5,6,null,null,undefined];
console.log(unique(arr));
// 利用reduce(这种写法还是第一次见,长见识了)
function unique(arry) {
return arry.reduce((prev, cur) => prev.includes(cur) ? prev : [...prev, cur], []);
}
let arr = [1,2,3,4,5,5,6,null,null,undefined];
console.log(unique(arr)); 数组对象去重 function unique(arr, key) {
const map = new Map()
return arr.filter((item) => !map.has(item[key] + '') && map.set(item[key] + '', 1))
}
let arr = [
{ name: 'a', num: 1},
{ name: 'b', num: 1},
{ name: 'c', num: 1},
{ name: 'd', num: 1},
{ name: 'a', num: 1},
{ name: 'a', num: 1},
{ name: 'a', num: 1}
]
console.log(unique(arr)); |
1.new Set(简单粗暴)
2.indexOf
3.includes
|
No description provided.
The text was updated successfully, but these errors were encountered: