#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. ах, потому что в описании вы сказали «удалить все элементы с этим значением», но я просто тестирую это, и это тоже работает, спасибо