数组去重
function func(arr){
var res = [arr[0]];
for(var i = 1; i < arr.length; i++)
for(var j = 0; j < res.length; j++)
if(arr[i] == res[j])
break;
else
res.push(arr[i]);
return res;
}
var arr = [1, 1,2,2,3]
alert(func(arr));//1,2,2,3,3,3??为什么会这样?应该是1,2,3啊
阿神2017-04-10 17:15:53
你主要是把内外层 for
的逻辑搞混淆了,内层主要是找有没有重置,外层才应该处理是否 push
。
function func(arr) {
var res = [arr[0]];
for (var i = 1; i < arr.length; i++) {
var isFound = false;
for (var j = 0; j < res.length; j++) {
if (arr[i] == res[j]) {
isFound = true;
}
}
if (!isFound) {
res.push(arr[i]);
}
}
return res;
}
var arr = [1, 1, 2, 2, 3];
alert(func(arr));
更建议把内外层分开
function find(v, res) {
for (var j = 0; j < res.length; j++) {
if (v == res[j]) {
return true;
}
}
return false;
}
function func(arr) {
var res = [arr[0]];
for (var i = 1; i < arr.length; i++) {
if (!find(arr[i], res)) {
res.push(arr[i]);
}
}
return res;
}
var arr = [1, 1, 2, 2, 3];
alert(func(arr));
当然既然这样分开了,上面的 find
就可以直接用原生函数 Array.prototype.indexOf
代替了
function func(arr) {
var res = [arr[0]];
for (var i = 1; i < arr.length; i++) {
if (res.indexOf(arr[i]) < 0) {
res.push(arr[i]);
}
}
return res;
}
var arr = [1, 1, 2, 2, 3];
alert(func(arr));
巴扎黑2017-04-10 17:15:53
如果想省事的话可以使用 lodash的 union 函数
自己写可以参考下面的代码
function union(arr){
var tmpObj={};
var ret=[];
for(var i = 1; i < arr.length; i++){
var v=arr[i];
if(!tmpObj[v]){
ret.push(v);
tmpObj[v]=1;
}
}
return ret;
}
黄舟2017-04-10 17:15:53
逻辑有问题~~~
for(var j = 0; j < res.length; j++) //这里遍历 res 数组 判断是否重复
if(arr[i] == res[j]) //结果,你如果遇到不等于 res 中的元素
break;
else
res.push(arr[i]); //就push元素到res了
// 应该 比较完 res 中所有元素, 再决定是否 push到 res
function func(arr){
var res = [arr[0]];
for(var i = 1; i < arr.length; i++)
if ( check(res, arr[i]) )
res.push(arr[i]);
return res;
}
function check(res, item){
for(var j = 0; j < res.length; j++)
if(item == res[j])
return false;
return true;
}
var arr = [1, 1,2,2,3]; func(arr)
黄舟2017-04-10 17:15:53
...
for(var j = 0; j < res.length; j++)
if(arr[i] == res[j])
break;
else
res.push(arr[i]);
...
不管哪种程序,尽量避免在循环自身的时候,还去更改自身内容,特别是去增删元素。
另外,那个写法效率不行,展示一下ES6的实现吧:
function func(a) {
return Array.from(new Set(a));
}
巴扎黑2017-04-10 17:15:53
function func(arr){
var res = arr;
for(var i = 1; i < arr.length; i++){
for (var j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) {
arr.splice(j, 1); //删除指定下标的元素
i = -1;
break;
}
}
}
return res;
}
var arr = [1, 1,2,2,3];
alert(func(arr));
PHPz2017-04-10 17:15:53
这是你要的去重
[1, 1,2,2,3].filter(function(v, i, m) {
return i <= m.indexOf(v);
});
至于为啥你写的不行,上面已经有人给出答案了
黄舟2017-04-10 17:15:53
最简单的改法:
function func(arr){
var res = [arr[0]];
for(var i = 1; i < arr.length; i++)
for(var j = 0; j < res.length; j++)
{if(arr[i] == res[j])
break;
if(j==res.length-1)//改动的地方!!
res.push(arr[i]);
}
return res;
}
var arr = [1, 1,2,2,3]
alert(func(arr));//1,2,2,3,3,3