Как удалить несколько элементов из массива?

Я хочу написать функцию, которая передает массив и необязательное количество значений, которые нужно удалить из массива в качестве параметров. Моя функция работает, когда есть только одно значение, но не работает, когда есть несколько значений.

const removeFromArray = function (arr, ...theArgs) {
  for (let i = 0; i < arr.length; i++) {
    if (theArgs.includes(arr[i])) {
      arr.splice(i, 1);
    }
  }
  return arr;
};
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
78
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Для этого вы можете использовать метод filter:

const removeFromArray = function (arr, ...theArgs) {
  return arr.filter( val => !theArgs.includes(val) )
};

const list = [1,2,3];
const newList = removeFromArray(list, 2,3);

console.info(newList);

И более лаконичный вариант:

const removeFromArray = (arr, ...args)=> arr.filter( val => !args.includes(val) )

Совет: стараются избегать изменения исходного массива и работают с копией или возвращают ее во время этих операций.

Ответ принят как подходящий

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

const removeFromArray = function (arr, ...theArgs) {
  for (let i = 0; i < theArgs.length; i++) {
    if (arr.includes(theArgs[i])) {
      arr.splice(arr.indexOf(theArgs[i]), 1);
    }
  }
  return arr;
};

Приведенное выше исправляет код по-своему, но лучший способ сделать это — использовать filter.

const removeFromArray = function (arr, ...theArgs) {
  return arr.filter(ele => !theArgs.includes(ele))
}

Я пишу это таким образом, чтобы просто поддерживать вашу функцию.

Проблема в том, что вы удаляете элемент из массива во время цикла из этого массива.

Каждый раз, когда ваш цикл for выполняет итерацию массива, он получит новый массив

например (1,2,3,4,5 => 2,3,4,5), но значение i продолжает увеличиваться на 1.

const removeFromArray = function (arr, ...theArgs) {
  for (let i = 0; i < arr.length; i++) {
  console.info(`arr:${arr}`,`item${arr[i]}`,`num${i}`)
  console.info(arr[i])
    if (theArgs.includes(arr[i])) {
      arr.splice(i, 1);
    }
  }
  return arr;
};
const testarray = [1,2,3,4,5]
console.info(removeFromArray(testarray,1,2,3))

Я бы предложил использовать массив в качестве второго параметра.

var array1 = ['a','b','c'];

var elementsToRemove = ['a','b'];

const removeFromArray = function (array1, elementsToRemove) {
    var filtered  = array1.filter(function(value, index, array){ 
        return elementsToRemove.includes(value);
    });
    return filtered;
  }

  console.info(removeFromArray(array1,elementsToRemove));

Другие вопросы по теме