// 1,排序后,删除重复单元
// 数组去重,之后是保留1,2,3,4,5内容
var arr = [1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5];
// 先给数组中的数据进行排序 从大到小,从小到大无所谓
arr.sort(function(a,b){return a-b});
// 数组去重思路
// 数值已经是按照顺序排列的
// 当前位置上的数据,与相邻的下一个位置上的数据,进行比较
// 如果相同,就删除下一个单元
// 必须要通过for循环,生成所有的索引下标
// 因为之后要通过操作索引下标的数值,来控制循环
for(var i = 0 ; i <= arr.length-1 -1 ; i++){
// 当前单元是 i 的数值 所表示的索引下标对应的单元 arr[i]
// 下一个单元是 i+1 的数值 所表示的索引下标对应的单元 arr[i+1]
// 判断这两个单元存储的数值,是否相同
// 一定要使用全等判断,确保判断数据类型
if(arr[i] === arr[i+1]){
// 如果 当前单元arr[i] 和 下一个单元 arr[i+1]
// 数据类型和数值都相同,就执行删除操作
// 删除 i+1 这个单元
// 从索引是 i+1 开始 删除 1个单元
arr.splice(i+1 , 1);
// 为了防止数组的坍塌
i--;
}
}
// 通过双层for循环来实现
// 原理是从第一个数值开始,与之后所有的数值数据,数据,一一进行比较
// 如果相同,就删除之后的数据,并且要执行 i-- 防止数组坍塌的影响
// 不用先进行数组的排序了
var arr = [1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5];
// 外层是从第一个到 倒数第二个 所有的索引下标
for(var i = 0 ; i <= arr.length-1-1 ; i++){
// 内层 是从 外层位置的 下一个位置开始 到 最后一个索引下标
for(var j = i+1 ; j <= arr.length-1 ; j++){
// 如果两个数据相同 arr[i] arr[j]
if(arr[i] === arr[j]){
// 删除后面的单元 也就是 从j 开始删除一个单元
arr.splice(j,1);
// 执行 j-- 防止数组坍塌的响应
j--;
}
}
}
// 总结
// 只要删除数组的单元,就一定会发生数组的坍塌
// 一定要执行 i-- 操作
// 让索引下标,重新回到引起数组删除,发生数组坍塌的单元
// 重新对坍塌之后,前移补充上来的单元,存储的数据进行比较操作
// 循环到最后一个单元,没有下一个单元与他进行比较
// 只要循环到,倒数第二个单元就可以了
// 使用 indexOf 方法
// 创建一个新的独立的数组
// 将原始数组中的数据,往新数组中写入 push() 或者 unshift()
// 添加判断条件,当新数组中没有当前数值时,再往新数组中写入数据
// 这样就不会有重复的数据被写入
var arr = [1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5];
// 新建一个数组
var newArr = [];
// 循环遍历 arr 中的所有数据单元
// 这次不需要使用删除数组单元的操作,for...in forEach都可以使用了
for(var i = 0 ; i <= arr.length-1 ; i++ ){
// 在新数组中使用indexOf() 查询当前 arr的索引下标表示的数值数据
// 如果 当前索引存储的数值数据,arr[i] 不在新数组中,返回值是 -1
// 数值不在新数组中,可以执行写入操作,将当前数值arr[i] 写入到新数组中
if( newArr.indexOf(arr[i]) === -1 ){
// 向新数组中,写入当前单元的数据
newArr.push(arr[i]);
}
}
console.log(newArr);
// for...in循环
// 通过自定义变量,存储生成索引下标
// for(var i in arr){
// if(newArr.indexOf(arr[i]) === -1){
// newArr.push(arr[i]);
// }
// }
// forEach循环
// arr.forEach(function(val){
// if(newArr.indexOf(val) === -1){
// newArr.push(val);
// }
// })