Перейти к содержимому

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

  • автор:

Удалить элемент из массива js

Есть массив и ф-ция, нужно удалять элементы с массива, я понимаю что delete удаляет элемент но после него образовывается «дырка», как его полностью удалить?

var myArr = [1, 2, 3, 6, 7, 13, 349, 3483, 5432]; var doubledOdds = onlyDoubledOdds(myArr); console.log(doubledOdds.length); console.log(doubledOdds); if (doubledOdds === myArr) < console.log('WTF?!'); >else < console.log('Ok'); >function onlyDoubledOdds(sourceArray) < var result = sourceArray; for (var i = 0; i < result.length; i++) < if (i % 2 == 0) < delete result[i]; >else < result[i] *= 2; >> return result; >

а вообще оно выводит 9
[ undefined, 4, undefined, 12, undefined, 26, undefined, 6966, undefined ]
WTF?! А нужно:
6
[ 2, 6, 14, 26, 698, 6966 ]
Ok

Отслеживать
81.1k 9 9 золотых знаков 78 78 серебряных знаков 135 135 бронзовых знаков
задан 11 июл 2016 в 9:04
61 1 1 золотой знак 1 1 серебряный знак 7 7 бронзовых знаков

delete оператор удаляет из памяти, а не из массива. из массива удаляют процедуры, относящиеся к классу массива ( array ), например pop

11 июл 2016 в 9:09
а что должна делать приведенная функция?
11 июл 2016 в 9:11
Про splice знаю, не могу понять как правильно записать. if (i%2 == 0) < result.splice[i]; >
11 июл 2016 в 9:20
@Webitek, а по какому принципу построен массив А нужно: 6 [ 2, 6, 14, 26, 698, 6966 ] ?
11 июл 2016 в 9:24

а почему он должен выбирать число 13? есть описание словами как из исходного массива получить результат?

11 июл 2016 в 10:33

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Для удаления можно использовать специальные методы, такие как

  • shift — удалит из начала
  • pop — с конца
  • splice — из середины

C помощью splice — как раз можно удалять элементы, вставлять элементы, заменять элементы – по очереди и одновременно.

Синтаксис таков:
arr.splice(start[, countDelete[, elemInsert1, . elemInsertN]])

т.е. удалить countDelete элементов, начиная с номера start , а затем вставить elemInsert1, . elemInsertN на их место. Если countDelete не указано, то отрежется все, начиная со start и до конца. Возвращает массив из удалённых элементов.

Пример с удалением выглядит так:

var arr = ["Привет", "тебе", "Миша"]; arr.splice(1, 1); // начиная с позиции 1, удалить 1 элемент alert( arr ); // осталось ["Привет", "Миша"] 
var arr = ["Привет", "тебе", "мальчик", "Миша"]; // удалить 3 первых элемента и добавить другие вместо них arr.splice(0, 3, "Здароф!") alert( arr ) // теперь ["Здароф!", "Миша"] 

Отслеживать
81.1k 9 9 золотых знаков 78 78 серебряных знаков 135 135 бронзовых знаков
ответ дан 11 июл 2016 в 9:16
Алексей Шиманский Алексей Шиманский
72k 12 12 золотых знаков 91 91 серебряный знак 180 180 бронзовых знаков

При применении оператора delete не изменяется свойство length массива, поэтому при использовании длины в цикле — разницы не будет.

Функция onlyDoubledOdds делает что-то непонятное, в зависимости от индекса элемента, причем меняет исходный массив, поэтому при сравнении возвращенное значение закономерно равно переданному, а не «WTF»

Если нужно отфильтровать массив — можно воспользоваться функцией filter,
если нужно получить массив на основе существующего, но с другими элементами — можно воспользоваться функцией map,
если хочется за один проход, можно воспользоваться функцией reduce

var myArr = [1, 2, 3, 6, 7, 13, 349, 3483, 5432]; var doubledOddsMapFilter = onlyDoubledOddsMapFilter(myArr); console.log('doubledOddsMapFilter.length', doubledOddsMapFilter.length); console.log('doubledOddsMapFilter', doubledOddsMapFilter); if (doubledOddsMapFilter === myArr) < console.log('WTF?!'); >else < console.log('Ok'); >var doubledOddsReduce = onlyDoubledOddsReduce(myArr); console.log('doubledOddsReduce.length', doubledOddsReduce.length); console.log('doubledOddsReduce', doubledOddsReduce); if (doubledOddsReduce === myArr) < console.log('WTF?!'); >else < console.log('Ok'); >function onlyDoubledOddsMapFilter(sourceArray) < return sourceArray.filter((el, i) =>i % 2 != 0).map(el => el * 2); > function onlyDoubledOddsReduce(sourceArray) < return sourceArray.reduce((acc, el, i) =>< if (i % 2 != 0) acc.push(el * 2); return acc; >, []); >

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

var myArr = [1, 2, 3, 6, 7, 13, 349, 3483, 5432]; var doubledOddsMapFilter = onlyDoubledOddsMapFilter(myArr); console.log('doubledOddsMapFilter.length', doubledOddsMapFilter.length); console.log('doubledOddsMapFilter', doubledOddsMapFilter); if (doubledOddsMapFilter === myArr) < console.log('WTF?!'); >else < console.log('Ok'); >var doubledOddsReduce = onlyDoubledOddsReduce(myArr); console.log('doubledOddsReduce.length', doubledOddsReduce.length); console.log('doubledOddsReduce', doubledOddsReduce); if (doubledOddsReduce === myArr) < console.log('WTF?!'); >else < console.log('Ok'); >function onlyDoubledOddsMapFilter(sourceArray) < return sourceArray.filter(el =>el % 2 != 0).map(el => el * 2); > function onlyDoubledOddsReduce(sourceArray) < return sourceArray.reduce((acc, el) =>< if (el % 2 != 0) acc.push(el * 2); return acc; >, []); >

Массивы

Задача. Заменить отрицательные элементы на противоположные по знаку. Для этого опишем процедуру. Ей будем передавать параметры — количество элементов в массиве и массив, который будет также и результатом выполнения процедуры, так как некоторые его элементы могут быть заменены.

Procedure Zamena (Var m : MyArray; n:integer);
Var
i : integer;
Begin
for i := 1 to n do
if m[i] < 0
then
m[i] := -m[i];
End;

Нахождение номеров элементов с заданным свойством

Задача. Найти и вывести на экран номера четных элементов. Для решения задачи необходимо просмотреть весь массив, и если просматриваемый элемент является четным, то выводить его номер.

Procedure PoiskChet(m : MyArray; n:integer);
Var
i : integer;
Begin
for i := 1 to n do
if m[i] mod 2 =0
then
Write(i:5);
End;

Нахождение количества элементов с заданным свойством

Задача. Найти количество положительных и отрицательных элементов в данном массиве. Опишем процедуру, которой будем отправлять параметры — массив, количество элементов в массиве и два счетчика, один для элементов, больших нуля, а второй — для отрицательных элементов.

Procedure OtrPol(m : MyArray; n:integer; Var k1, k2 : Integer);
Var
i : integer;
Begin
k1 :=0;
k2 :=0;
for i := 1 to n do
if m[i] > 0
then
Inc(k1)
else
if m[i] < 0
then
Inc(k2);
End;

Есть ли в данном массиве элементы с данным свойством?

Для решения таких задач удобнее использовать циклы с условиями и составлять функции, результат которых имеет логический тип. Задача. Есть ли отрицательный элемент в массиве? Начинаем с первого элемента (i=1). Пока не просмотрен последний элемент (i<=n) и не найден отрицательный (m[i]>=0), будем переходить к следующему (Inc(i)). Таким образом, мы закончим просмотр массива в одном из двух случаев: первый – просмотрели все элементы и не нашли отрицательный, тогда i>n, второй – нашли нужный, при этом i

Function Control (m : MyArray; n:integer) : Boolean;
Var
i : integer;
Begin
i := 1;
while (i<=n) and (m[i]>0) do
Inc(i);
Control := (i<=n);
End;

Как удалить определенный элемент из массива js

Правильным способом удаления элемента из массива будет использование метода splice() . Этот метод принимает три аргумента, но нам нужны только первые два из них. Это индекс начиная с которого мы хотим удалить элементы. А также количество элементов, которые будут удалены из массива. Взгляните на пример ниже:

const letters = ["a", "b", "c"]; const index = 1; array.splice(index, 2); console.log(letters); // => [ 'a' ] 

18 октября 2022

Часто бывает в задачах, что нам требуется удалить из массива определенный элемент.
Один из способов — это воспользоваться функцией высшего порядка filter:

// К примеру, дан массив из чисел: const numbers = [1, 2, 3, 4, 5]; //необходимо удалить элемент, который равен трём. const numberToDelete = 3; //фильтруем исходный массив. //А для того, чтобы его не мутировать, присвоим его в новую переменную. const filteredNumbers = numbers.filter((number) => number !== numberToDelete); console.log(filteredNumbers); // => [1, 2, 4, 5] //Готово! 

Также есть самый явный способ для удаления элемента массива с помощью ключевого слова delete:

let fruits = ['banana', 'orange', 'apple']; //Допустим, что нам нужно удалить нулевой элемент массива. delete fruits[0]; console.log(fruits); // => [ , 'orange', 'apple' ] 

Обратите внимание, что на месте нулевого элемента осталось пустое место. Как правило, удалять элемент массива таким способом не является хорошей практикой. Данный способ приведен в качестве примера.

Если вам нужно удалить последний элемент массива, для этого есть способ — это метод pop(). Перейдём к примеру:

const fruits = ['banana', 'orange', 'apple']; fruits.pop(); console.log(fruits); // получаем => [ 'banana', 'orange' ] 

Но это еще не всё!
Одним из наиболее удобных методов для удаления элемента массива является метод splice():

const names = ['John', 'Darina', 'Mark', 'Kris']; //допустим, что дан массив имён. // Нам необходимо удалить из массива второй элемент. names.splice(2, 1); // начиная со второго элемента удаляем один элемент console.log(names); // => [ 'John', 'Darina', 'Kris' ] 

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

Документация:
  • Функция высшего порядка filter
  • Метод splice()
  • Метод pop()

Удаление элемента из массива по значению в JavaScript

Removing an element from a JavaScript array.

Часто в программировании возникает ситуация, когда необходимо удалить элемент из массива, не зная его индекс, но зная его значение. Например, есть массив цветов:

let colors = ['red', 'blue', 'green', 'yellow'];

И нужно удалить из него цвет ‘green’.

В JavaScript метод splice() позволяет удалить элемент из массива, но он требует знания индекса элемента. Если необходимо удалить элемент по значению, подходящего стандартного метода не существует. Но это можно сделать, например, с помощью комбинации методов indexOf() и splice() .

Метод indexOf()

Метод indexOf() возвращает первый индекс, по которому данный элемент может быть найден в массиве, или -1, если такого индекса нет.

let index = colors.indexOf('green');

В этом примере index будет равен 2, так как ‘green’ находится на позиции с индексом 2. Если бы ‘green’ не было в массиве, index был бы равен -1.

Метод splice()

Зная индекс, можно применить метод splice() , который изменяет содержимое массива, удаляя существующие элементы и/или добавляя новые.

if (index !== -1)

В этом примере splice() удаляет один элемент, начиная с позиции index .

Таким образом, комбинируя indexOf() и splice() , можно удалить элемент из массива по его значению.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *