Вы используя «промежуточное значение» 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; });
Это говорит о том, отфильтровывать номер, если место, где он впервые найден в массиве является его местоположение. Другими словами, отфильтруйте числа, которые встречаются ранее в массиве.
Почему 'return d;'? – Bergi