Ожидаемый результат: ['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))
Чтобы сохранить ту же ссылку на объект 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, до которого итерация уже была выполнена.