Почему не работает проверка на равенство элементов в двух массивах в цикле?
Задача: Функция принимает 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()