不知怎么就想到这里了,动手总结算,算是给自己看的吧。
尽量做到简单易懂。注释清楚。包括些许基础的知识点。(就是文字表达不行,懒得想,直接注释了。)
直接进入主题。没有demo,基本控制台都可以测试。
!!!基础篇。 建立在array的值都是基本类型的情况。TODO
第一种: 基本可以摈弃。当时还不知道数组的一些方法,就纯用for去实现的。(按照思路写的,又稍许更改)
//TODO 这里是有问题的。如果不是传进来的不是array,需要转化为array或者告知错误。鉴于是基础篇章,就不展开了。之后找机会下一篇。
function unique1(arr) {
if (arr === undefined) { //设置默认值,也可以通过ES6 参数设置默认值。
arr = [1, 2, 1, 2, 3, 'a', 'b', 'a', 'c'];
}
var result = [];
result.push(arr.shift(1)) //直接把arr第一个值push到result里。Array.prototype.shift/push 都会更改使用此方法的数组
var len = arr.length;
//原数组作为外层循环遍历,内层循环reuslt因为值会改变,就不提取len出来。
for (var i = 0; i < len; i++) {
for (var j = 0; j < result.length; j++) {
if (arr[i] === result[j]) { //当arr[i]的某一项等于result的任意一项就跳出此次内层循环。
break;
}
if (j === result.length - 1) { //如果遍历完result的所有项都没有重复的的情况下讲当前arr[i]push到result里。
result.push(arr[i])
}
}
}
return result;
}
第二种: 利用Array.prototype.indexof() 来处理。(事实上,自己在用第一种方法解决问题后,没过几天就看到了这个inexof。觉得自己当时真实蠢到爆。)
indexOf()方法返回在数组中可以找到给定元素的第一个索引,如果不存在,则返回-1。
function unique2(arr = [1, 2, 1, 2, 3, 'a', 'b', 'a', 'c']) { //嗯。推荐关键词 “ES6 函数参数的默认值”
var result = [];
for (var i in arr) { //和之后的for of 对比来看。
if (result.indexOf(arr[i]) === -1) { //判断如果arr[i]不存在于result数组里面,就push该元素到result里。
result.push(arr[i]);
}
}
return result;
}
代码很简单,也不细说了。
这里相对第一种,代码量减少很多。(第一种其实就是这种思路没有内置方法的实现)。
第三种: 逻辑—先把arr排序。然后遍历arr每个值,判断其和result最后1个值是否相等,来决定是否将此值推入数组。
function unique3(arr = [1, 2, 1, 2, 3, 'a', 'b', 'a', 'c']) {
var result = [] //之前给result[0]赋值其实就为了减少不必要的循环而已。不一定需要给result[0]赋值。
arr.sort();
for (var value of arr) { //嗯。for of/if 就单纯在这里的差别可以理解为一个 是 遍历到 当前的 value ,一个是遍历到当前的index
if (value !== result[result.length - 1]) { //当value=1,也就是arr[0]时,result[result.length - 1] = undefined
result.push(value)
}
}
return result;
}
第四种:利用ES6的Set(set有点类似数组,但是它本身是不能重复的。!。本身就帮我们去重了)。然后我们将其转为数组就好了。
集合(Set)对象允许你存储任意类型的唯一值(不能重复),无论它是原始值或者是对象引用。
function unique4(arr = [1, 2, 1, 2, 3, 'a', 'b', 'a', 'c']) {
var set = new Set(arr) //得到去重后的set。
var result1 = Array.from(set) //method1: from 可以从一个类数组对象或可遍历对象中创建一个新的数组。
var result2 = [...set]; //method2: 使用拓展运算符
var result3 = []; //method3: 使用for...of循环。
for (v of set) {
result3.push(v)
}
return {
array_from: result1,
spreading :result2,
for_of :result3,
}
}
TODO 第四种。嗯,自己也仅处于会“用”的阶段而已。代完善。
(2017/5/14 1:40。写到这里回头看,发现挖坑好多。争取早日填坑。)