В документации uniqWith
о вызове обратного вызова говорится только следующее:
Компаратор вызывается с двумя аргументами: (arrVal, othVal) .
Я лично не стал бы использовать функцию сравнения uniqWith
для итерационной работы. В документации не указано, как часто и в каком порядке будет вызываться функция сравнения. Скажем, у вас есть массив [1,2,3]
. Я бы предположил, что каждый элемент сравнивается со всеми элементами на выходе, чтобы проверить уникальность. Реализация может выглядеть примерно так:
function uniqWith(array, compareFn) {
const unique = [];
for (const current of array) {
const isDuplicate = unique.some(other => compareFn(current, other));
if (!isDuplicate) unique.push(current);
}
return unique;
}
Если это действительно так, это означает, что обратный вызов никогда не вызывается для 1
, один раз для 2
и дважды для 3
.
Вообще говоря, не используйте функции обратного вызова для выполнения итераций, если только функция, принимающая обратный вызов, не сообщает, когда / как часто / в каком порядке и c. эта функция вызывается.
Возьмем, к примеру, метод Array forEach
. Документация раскрывает все эти вещи.
forEach()
вызывает предоставленную callback
функцию один раз для каждого элемента в массиве в порядке возрастания. Он не вызывается для свойств индекса, которые были удалены или не инициализированы. (Для разреженных массивов см. Пример ниже .)