В чем ошибка? Идей нет совсем
задача на codewars. нужно отнять массив b от а и вернуть разницу.
function arrayDiff(a, b) {
let arrA = [];
if (b == '') {
arrA = a.slice();
} else {
a.forEach(function(elA) {
for (let i = 0; i < b.length; i++) {
if (elA != b[i]) {
arrA.push(elA);
}
}
});
}
return arrA;
}
работает не всегда корректно, например вот:
arrayDiff([19,-16,-19,17,13,15,-20,6,-1,-6,5,-14,11,-3,-17],[-19,-16,17,-20,-1,-3,19,6,-6,11])
ожидается:
[13, 15, 5, -14, -17]
получаем:
[19, 19, 19, 19, 19, 19, 19, 19, 19, -16, -16, -16, -16, -16, -16, -16, -16, -16, -19, -19, -19, -19, -19, -19, -19, -19, -19, 17, 17, 17, 17, 17, 17, 17, 17, 17, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -20, -20, -20, -20, -20, -20, -20, -20, -20, 6, 6, 6, 6, 6, 6, 6, 6, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -6, -6, -6, -6, -6, -6, -6, -6, -6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, 11, 11, 11, 11, 11, 11, 11, 11, 11, -3, -3, -3, -3, -3, -3, -3, -3, -3, -17, -17, -17, -17, -17, -17, -17, -17, -17, -17]
я уже что только не пробовал, и фильтр, и кучу раз все переписывал, идеи кончились.
Ответы (2 шт):
Автор решения: Qwertiy
→ Ссылка
Квадратичный алгоритм:
return a.filter(x => !b.includes(x))
Линейный алгоритм:
b = new Set(b)
return a.filter(x => !b.has(x))
Автор решения: Oca Guiliva
→ Ссылка
Итак! Кроме отличного варианта из ответа выше, я предлагаю свое решение. Чуть чуть изменив цикл, вот что получилось:
function arrayDiff(a, b) {
let arrA = [];
if (b == '') {
arrA = a.slice();
} else {
a.forEach(function(elA) {
for (let i = 0; i < b.length; i++) {
if (elA == b[i]) {
return elA = b[i];
}
}
arrA.push(elA);
});
}
return arrA;
}
почему изменив условие if (elA == b[i]) он вдруг заработал как надо я так и не понял, но тем не менее.