сращивание массива не работает должным образом внутри функции

Ожидаемый результат: ['jan']
Фактический результат: ['jan', 'apple']

Функция forEach останавливается после операции соединения. закомментированный код работает должным образом, но когда я пытаюсь использовать подобное с foreach, код не работает должным образом.

var mainArr = ['jan', 'feb', 'apple'];
var exArr = ['feb', 'apple'];
removeGivenArr(mainArr, exArr);

function removeGivenArr(mainArr, exArr) {
  mainArr.forEach((item, index) => {

    if (exArr.includes(item)) {
      console.log(item);
      mainArr.splice(index, 1);
    }
    console.log(mainArr);

  });
}

// function removeGivenArr(mainArr, exArr){

//     const output = [];
//     for(let element of mainArr){
//         if(!exArr.includes(element)){
//             output.push(element);
//         }

//     return output;
//     }   
// }

Всего 4 ответа


const mainArr = ['jan', 'feb', 'apple'];
const exArr = ['feb', 'apple'];

const filterArr = (mainArr, exArr) => {
  return mainArr.filter((char) => {
    return exArr.indexOf(char) === -1;
  });
}
console.log(filterArr(mainArr, exArr))
Вы можете просто использовать фильтр и indexOf для достижения этого.


Чтобы сохранить ту же ссылку на объект mainArr , вы можете выполнять итерации с конца массива и удалять ненужные части, не нарушая индекс.

function removeGivenArr(mainArr, exArr) {
    var i = mainArr.length;
    while (i--) if (exArr.includes(mainArr[i])) mainArr.splice(i, 1);
}

var mainArr = ['jan', 'feb', 'apple'],
    exArr = ['feb', 'apple'];

removeGivenArr(mainArr, exArr);
console.log(mainArr);


Прочитайте ответ « Сращивание массива Javascript из обратного вызова, переданного forEach» для получения дополнительной информации.

Вместо этого используйте фильтр.

var mainArr = ['jan', 'feb', 'apple'];
var exArr = ['feb', 'apple'];
mainArr = removeGivenArr(mainArr, exArr);
console.log(mainArr)
function removeGivenArr(mainArr, exArr) {
  return mainArr.filter((item) => !exArr.includes(item)) 
}


ForEach остановлен, потому что сплайс работает на месте. Фактический массив видоизменяется и понижает последний индекс до 1, до которого итерация уже была выполнена.


Есть идеи?

10000