Я хочу написать функцию, которая передает массив и необязательное количество значений, которые нужно удалить из массива в качестве параметров. Моя функция работает, когда есть только одно значение, но не работает, когда есть несколько значений.
const removeFromArray = function (arr, ...theArgs) {
for (let i = 0; i < arr.length; i++) {
if (theArgs.includes(arr[i])) {
arr.splice(i, 1);
}
}
return arr;
};
Для этого вы можете использовать метод 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));