先定义一个用于去重的数组arr = [1,2,"2",4,9,"a","a",2,3,5,6,5]
(1)method 1: 新建一个空数组,对原数组进行遍历,如果新数组中没有则添加
function unique (array) {
var tmp = []
array.forEach(function (value) {
if(tmp.indexOf(value)===-1) {
tmp.push(value)
}
})
console.log(tmp)
}
unique(arr)
(2)method 2: 使用对象键值——对象的键不重复
function unique(array){
var temp = {}, r = [], len = array.length, val, type;
for (var i = 0; i < len; i++) {
val = array[i];
type = typeof val
if (!temp[val]) {
temp[val] = [type]
r.push(val)
} else if (temp[val].indexOf(type) < 0) {// 区分数字2 和 字符2
temp[val].push(type)
r.push(val)
}
}
return r
}
console.log(unique(arr))
(3)method 3: 排序后相邻重复则去除,当相同元素的不同类型(比如数字类型和字符类型)同时出现在数组中时时会出现问题,要慎用
function unique (array) {
if(array.length<=0) return
array.sort()
var tmp = []
tmp.push(array[0])
for(var i=1;i<array.length-1;i++) {
if(array[i]!==tmp[tmp.length-1])
tmp.push(array[i])
}
console.log(tmp)
}
unique(arr)
(4)method 4: 借助数组下标
function unique(array) {
var temp = []
for (var i=0;i<array.length;i++) {
if(array.indexOf(array[i])===i)
temp.push(array[i])
}
console.log(temp)
}
unique(arr)
(5)优化两重循环遍历数组,找到右侧重复元素则终止当前循环,开始数组中的下一个元素与右侧所有元素进行比较
首先感谢可爱的人一次次指正错误,目前确定为正确方案
function unique (array) {
var temp = []
var len = array.length
for(var i=0;i<len;i++) {
for(var j=i+1;j<len;j++) {
if(array[i]===array[j]) {
j = ++i
console.log("i "+i, "j "+j);
}
}temp.push(array[i])
}console.log(temp)
}
var arr = [1,2,3,3,4,5,2,10,1,0,5,6]
unique(arr)
右侧为结果截图:
第五种方法类似于使用两个指针i和j,i指针指向当前要判断是否与右侧元素重复的元素,j指针开始时指向i指向的下一个元素并且遍历右侧元素,若找到相等元素则将i指针后移,j指针与i指针指向同一个元素,在进入新的内层循环时,j指针自增1(因为会先执行j++,有关for循环的执行规则看下方解释),指向下一个元素。
// for循环的表达式之间用的是;号分隔的,千万不要写成,
for (初始化表达式1; 判断表达式2; 自增表达式3) {
// 循环体4
}
执行顺序:1243 ---- 243 -----243(直到循环条件变成false)
1. 初始化表达式
2. 判断表达式
3. 自增表达式
4. 循环体

1215

被折叠的 条评论
为什么被折叠?



