сращивание массива не работает должным образом внутри функции - PullRequest
0 голосов
/ 12 февраля 2020

Ожидаемый выход: ['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 ]

0 голосов
/ 12 февраля 2020

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

0 голосов
/ 12 февраля 2020

Для сохранения той же ссылки на объект 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);
0 голосов
/ 12 февраля 2020

Прочитать ответ Соединение массива 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)) 
}
0 голосов
/ 12 февраля 2020

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 для достижения этого.
...