Javascript 使用reduce方法消除任何重复的数字
我尝试使用如下的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;
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甚至没有公布。我知道这是一篇老文章,但我只是想知道