В чем ошибка? Идей нет совсем

задача на 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]) он вдруг заработал как надо я так и не понял, но тем не менее.

→ Ссылка