Удалить определенное количество элементов в массиве

#javascript #arrays

#javascript #массивы

Вопрос:

я хочу указать, сколько 1 элементов я хочу удалить в этом массиве:

 const array = [1, 1, 2, 3, 1, 5];
  

Я пробовал так:

 const array = [1, 1, 2, 3, 1, 5];

const i = array.indexOf(1);
if (i > - 1) {
  array.splice(i, 1);
}
  

но это удаляет только первый элемент 1 в массиве

Комментарии:

1. Как определить, сколько элементов 1 нужно удалить? И какие из них сохранить? Вы хотели бы сохранить первую итерацию того же элемента?

Ответ №1:

Попробуйте это, Array.prototype.filter создаст новый массив и не будет мутировать или изменять массив, для которого он вызывается.

 const arr = [1, 1, 2, 3, 1, 5];

const newArr = arr.filter((item) => item !== 1);
console.log(newArr);

const removeArrayItem = (array, item) => array.filter((i) => i !== item);
console.log(removeArrayItem([1, 2, 2, 2, 2, 3, 4, 5], 2));
console.log(removeArrayItem([1, 2, 2, 2, 2, 3, 4, 5, 6, 7, 8, 8, 8], 8));

// or using reduce
const removeDuplicateItem = (arr, itemToRemove, count) =>
  arr.reduce(
    (accumulator, currentItem) => {
      if (
        accumulator.count amp;amp;
        accumulator.count > 0 amp;amp;
        currentItem === itemToRemove
      ) {
        accumulator.count -= 1;
        return accumulator;
      }

      accumulator.result.push(currentItem);

      return accumulator;
    },
    {
      count,
      result: [],
    },
  ).result;

// This will remove 5 number twos
console.log(removeDuplicateItem([1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 5, 6, 7, 8, 8, 8], 2, 5));  

Комментарии:

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

2. это решение не изменяет массив.

Ответ №2:

Вам нужно повторить подсчет и проверить, доступен ли элемент для удаления.

 function remove(array, value, count) {
    while (count--) {
        const i = array.indexOf(value);
        if (i === -1) break;
        array.splice(i, 1);
    }
}

const array = [1, 1, 2, 3, 1, 5];

remove(array, 1, 2);

console.log(array);  

Комментарии:

1. функция стала немного большой, но она действительно работала, спасибо

Ответ №3:

Если вы хотите удалить только 1 указанное вами количество s,
вы можете использовать цикл for с 2 условиями: одно для размера массива, а второе для количества раз 1 , когда было найдено и удалено.

 const array = [1, 1, 2, 3, 1, 5];
const counter = 2;

for(let i = 0 , n = 0; i < array.length amp;amp; n < counter; i  ) {
  if(array[i] === 1) {
    array.splice(i, 1);
    i -= 1;
    n  ;
  }
}

console.log(array);  

Комментарии:

1. @NinaScholz Я повторяю с начала массива, что вы имеете в виду?

Ответ №4:

Вы можете использовать while цикл, чтобы удалить N количество элементов с этим значением:

 const removeNInstancesOfX = (array, n, x) => {
     let i = null, count = 0, arr = [...array];
     while ((i = arr.indexOf(1)) !== -1 amp;amp; count   < n)
          arr.splice(i, 1);
     return arr;
}

let array = [1, 1, 2, 3, 1, 5];
     
array = removeNInstancesOfX(array, 2, 1);

console.log(...array);  

Комментарии:

1. Мне нужен способ удалить только указанное мной количество, но я думаю, что нашел решение

2. @zGuGodzin n — это количество элементов, которые вы хотите удалить

3. ах, потому что в описании вы сказали «удалить все элементы с этим значением», но я просто тестирую это, и это тоже работает, спасибо