Почему не работает проверка на равенство элементов в двух массивах в цикле?

Задача: Функция принимает 2 массива и возвращает новый массив. В новом массиве собраны все элементы из первого массива, которых нет во втором массиве. Написал таким образом:

let arr, arrSmall;
arr = [];
arrSmall = [];
for (let i = 0; i < 10; ++i) {
    arr[i] = Math.floor((Math.random() * 100));
}
for (let i = 0; i < 5; ++i) {
    arrSmall[i] = Math.floor((Math.random() * 100));
}
firstNoSecond = () => {
    let arrFirstNoSecond;
    arrFirstNoSecond = [];
    for (i = 0; i < arr.length; ++i) {
        Large: {
            for (j = 0; j < arrSmall.length; ++j) {
                Small: {
                    if (arr[i] === arrSmall[j]) {
                        break Large;
                    }
                    else {
                        arrFirstNoSecond[i] = arr[i];
                        break Small;
                    }
                }
            }    
        }
    }
    console.log(`Элементы первого, которых нет во втором - ${arrFirstNoSecond}`);
    console.log(arrFirstNoSecond.length);
}

Не работает - всегда возвращает длину массива 10 и не удаляет совпадающие элементы. В чем причина?


Ответы (1 шт):

Автор решения: Алексей Р

Код чрезмерно усложнен и запутан. Основная ошибка в том, что в конструкции

Small: {
        if (arr[i] === arrSmall[j]) {
            break Large;
        }
        else {
            arrFirstNoSecond[i] = arr[i];
            break Small;
        }
       }

вы игнорируете одинаковые числа только в том случае, если эти числа - первые по порядку во втором массиве. В ином случае вы просто не доходите до проверки такого числа, поскольку сразу заносите его в результирующий массив и прерываете цикл.

Вообще удобнее без явных циклов делать.

const generate = (n) => Array.from({length: n}, () => Math.floor(Math.random() * 10))
const arr = generate(10), arrSmall = generate(5)
const out = arr.filter(x => !arrSmall.includes(x))
console.log(`Первый массив: ${arr}\nВторой массив: ${arrSmall}\nРезультат:     ${out}`)

С циклами

generate = (n, range) => {
    const out = []
    for (let i = 0; i < n; i++)
        out.push(Math.floor(Math.random() * range))
    return out
}

const arr = generate(10, 10), arrSmall = generate(5, 10);
console.log(`Первый = [${arr}]`);
console.log(`Второй = [${arrSmall}]`);

firstNoSecond = () => {
    const arrFirstNoSecond = [];
    for (let i = 0; i < arr.length; i++) {
        Large:{
            for (let j = 0; j < arrSmall.length; ++j) {
                if (arr[i] === arrSmall[j])
                    break Large;
            }
            arrFirstNoSecond.push(arr[i]);
        }
    }
    console.log(`Элементы первого, которых нет во втором - [${arrFirstNoSecond}], длина = ${arrFirstNoSecond.length}`);
}

firstNoSecond()

→ Ссылка