2015-06-20 22 views
0

我试图用减少方法如下但消除重复,这是不太工作:使用减少的方法来消除任何重复的数字

var unique = function(array) { 
array = array.sort(function(a,b) {return a-b;}); 
var noDup = [array[0]]; 
array.reduce(function(c,d) { 
    if(c!==d) { 
     noDup.push(d); 
     return d; 
    } 
}); 
return noDup; 
}; 
var x = [9,2,1,5,9,1,1,4,2,9];//==>[1, 1, 2, 4, 5, 9, 9] 
+0

为什么'返回d;'? – Bergi

回答

2

你是使用reduce的“中间值”来保存先前的值,因此您可以在下次通过时检查它。但是,这使得你无法计算出你想要的真正的中间值,这是你正在构建的独特阵列,所以你不得不在外面宣布它(noDup),这种失败是完全的目的。然后你的代码有问题,如不提供初始值reduce。在这种情况下,reduce有一个特殊的行为,就是用数组的前两个值调用回调函数;你没有正确处理的情况。

无论如何,因为它似乎你愿意数组排序,你能避免做一个indexOf每一次循环,通过只记住前值和检查反对:

function unique(values) { 
    var prev; 
    return values . sort() . reduce(function(result, cur) { 
     if (cur !== prev) result.push(cur); 
     prev = cur; 
     return result; 
    }, []); 
} 

但事实证明实际上我们不需要保留prev的值;相反,我们可以简单地直接引用前一个元素,因为filter通过指数和数组的附加参数回调,所以:

function unique(values) { 
    return values . sort() . reduce(function(result, cur, index, array) { 
     if (cur !== array[index-1]) result.push(cur); 
     return result; 
    }, []); 
} 

但是,如果你仔细想想,这只不过是用书面的过滤器更减少。它只是筛选出与前一个相同的数字。所以只是把它写作为过滤器开始:

function unique(values) { 
    return values . sort() . filter(value, i, arr) { return value !== arr[i-1]; }); 
} 

还有其他的方法来去除使用过滤器不需要排序重复。这里有一个简单的例子:

values . filter(function(value, i, arr) { return arr.indexOf(value) === i; }); 

这是说,过滤出一个数字,如果它在数组中第一次找到的位置是它的位置。换句话说,过滤出数组中较早出现的数字。

+0

我刚刚对第一种方法有疑问。你用'if(cur!== prev)result.push(cur);'但prev甚至没有宣布。这是如何工作的当我这样做时,我通常会得到错误我知道这是一个旧帖子,但只是想知道 – daddycardona

3
function unique(values) { 
    return values.reduce(function(prev, cur) { 
     if (prev.indexOf(cur) == -1) { 
      prev.push(cur); 
     } 

     return prev; 
    }, []); 
} 

unique([9,2,1,5,9,1,1,4,2,9]) // --> [9, 2, 1, 5, 4] 

fiddle