1.最容易想到的方案 支持IE8+
function unique(arr) {
var ret = []
for (var i = 0; i < arr.length; i++) {
var item = arr[i]
if (ret.indexOf(item) === -1) {
ret.push(item)
}
}
return ret
}
2.IE6-IE8 for两次 性能一般
var indexOf = [].indexOf ?
function(arr, item) {
return arr.indexOf(item)
} :
function indexOf(arr, item) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] === item) {
return i
}
}
return -1
}
function unique(arr) {
var ret = []
for (var i = 0; i < arr.length; i++) {
var item = arr[i]
if (indexOf(ret, item) === -1) {
ret.push(item)
}
}
return ret
}
ES6写法
用之前先了解下Array.from()
Array.from()将类数组转换成数组
let arrayLike = {
0: 'wen',
1: '18',
2: '男',
3: ['haha','hehe','heihei'],
'length': 4
}
let arr = Array.from(arrayLike)
console.log(arr) // ['wen','18','男',['haha','hehe','heihei']]
如果上面数据没有length属性呢?
let arrayLike = {
0: 'wen',
1: '18',
2: '男',
3: ['haha','hehe','heihei'],
}
let arr = Array.from(arrayLike)
console.log(arr) // []空数组
我们得到了一个结论 类数组想要通过 Array.form()转换
将字符串转换为数组
let str = 'hello world!';
console.log(Array.from(str)) ///["h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d", "!"]
Array.from还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组。如下:
let arr = [12,34,56,78,9,520]
let set = new Set(arr)
console.log(Array.from(set, item => item + 1))
//[13, 35, 57, 79, 10, 521]
1.Set + Array.from() 只能去重一阶数组
let arr = Array.from(new Set([1,2,3,5,7,1,2,1]))
console.log(arr); //[1,2,3,5,7]
console.log(arr.length);//5
for (let i = 0; i < arr.length; i++) {
console.log(arr[i]);
//1
//2
//3
//5
//7
};
这个例子说明了转换之后的数据可以遍历 有长度。
let arr = Array.from(new Set([1,2,3,5,7,1,2,1,[1,1,1]]))
console.log(arr);
/[,2,3,5,7,[1,1,1]]
二阶数组去重不能用Set+Array.form()
2 …[拓展运算符] + Set
let arr = [...new Set([1,2,3,5,7,1,2,1])]
console.log(arr);// [1,2,3,5,7]