Javascript 使用reduce方法消除任何重复的数字

Javascript 使用reduce方法消除任何重复的数字,javascript,reduce,higher-order-functions,Javascript,Reduce,Higher Order Functions,我尝试使用如下的reduce方法来消除重复项,但是,它不太有效: 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;

我尝试使用如下的reduce方法来消除重复项,但是,它不太有效:

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]

您正在使用
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
将index和array的附加参数传递给回调,所以:

function unique(values) {
    return values . sort() . reduce(function(result, cur, index, array) {
        if (cur !== array[index-1]) result.push(cur);
        return result;
    }, []);
}
但是如果你仔细想想,这只不过是一个使用reduce编写的过滤器。它只是过滤掉与前一个相同的数字。因此,只需将其作为过滤器编写即可:

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; });
这意味着,如果在数组中第一次找到数字的位置是它的位置,则过滤掉一个数字。换言之,过滤掉数组中较早出现的数字。

您正在使用
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
将index和array的附加参数传递给回调,所以:

function unique(values) {
    return values . sort() . reduce(function(result, cur, index, array) {
        if (cur !== array[index-1]) result.push(cur);
        return result;
    }, []);
}
但是如果你仔细想想,这只不过是一个使用reduce编写的过滤器。它只是过滤掉与前一个相同的数字。因此,只需将其作为过滤器编写即可:

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; });

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

我只是对您的第一种方法有个问题。您使用了'if(cur!==prev)result.push(cur);'然而,prev甚至没有公布。我知道这是一篇老文章,但我只是想知道我对你的第一种方法有一个问题。您使用了'if(cur!==prev)result.push(cur);'然而,prev甚至没有公布。我知道这是一篇老文章,但我只是想知道