js数组去重(2018.02.05)
aermin opened this issue · 0 comments
aermin commented
不用api
思路
1.构建一个新的数组存放结果
2.for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比
3.若结果数组中没有该元素,则存到结果数组中
code
Array.prototype.arrUnique_for = function () {
let res = [this[0]];
let flag = false;
for (let i = 1; i < this.length; i++) {
for (let j = 0; j < res.length; j++) {
if (this[i] === res[j]) {
flag = true;
break;
}
}
if (!flag) {
res.push(this[i]);
}
flag = false;
}
return res;
}
用ES5
用indexOf的常规操作
思路
建一个空的临时数组,遍历传进来的参数(数组),并用临时数组.indexOf对数组的每一个值做判断,等于 -1表示临时数组没有这个值且收下这个值,否则表示已经有一个这个值了,拒收。
最后,临时数组就是我们要的去重后的数组。
code
function unique(arr) {
var n = [];
for (var i = 0; i < arr.length; i++) {
if (n.indexOf(arr[i]) == -1) n.push(arr[i]);
}
return n;
};
var arr=[1, 2, 1, 1, '1'];
console.log(unique(arr)); //[1, 2, "1"]
稍微优化一下
code
Array.prototype.unique = function() {
var n = []; //一个新的临时数组
for (var i = 0; i < this.length; i++) { //遍历当前数组
if (n.indexOf(this[i]) == -1) n.push(this[i]); //如果当前数组的第i已经保存进了临时数组,那么跳过,否则把当前项push到临时数组里面
}
return n;
};
var arr=[1, 2, 1, 1, '1'];
console.log(arr.unique()); //[1, 2, "1"]
备注:
①Array.prototype 属性表示 Array 构造函数 [] 的原型 ,也就是[]是Array的一个实例, 所以本例子中 arr继承了Array.prototype的unique方法,且unique方法的this指向arr。
Array.prototype
js中 [].slice 与 Array.prototype.slice 有什么区别?
用ES6
常规操作
code
function unique(array) {
return Array.from(new Set(array));
}
var array = [1, 2, 1, 1, '1'];
console.log(unique(array)); // [1, 2, "1"]
备注:
①Array.from() 方法从一个类似数组或可迭代对象中创建一个新的数组实例。
②ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
长这样
极简操作
code
var unique = (a) => [...new Set(a)]
var array = [1, 2, 1, 1, '1'];
unique(array)
备注:
① 扩展运算符(spread)是三个点(...)。它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列 数组的扩展