Проблема в том, что вы return x
из фильтра обратного вызова. Если x
(элемент, который повторяется) равен false, результат не будет включен в окончательный массив, , даже если тест b.indexOf(x) == -1
выполнен.
Выполните То же самое вы делаете с нижним кодом:
return b.indexOf(x) == -1
function array_diff(a, b) {
return a.filter(function removeDuplicate(x) { return b.indexOf(x) === -1 });
}
console.log(array_diff([0,1,2,3,4],[2,4])); // [0, 1, 3]
(в качестве примечания: нигде в коде не используются функции стрелок)
Вы можете уменьшить вычислительную сложность с O(n ^ 2)
до O(n)
путем создания набора b
вместо проверки indexOf
s на нем на каждой итерации:
function array_diff(a, b) {
const bSet = new Set(b);
return a.filter(function removeDuplicate(x) { return !bSet.has(x); });
}
console.log(array_diff([0,1,2,3,4],[2,4])); // [0, 1, 3]