Поиск массива javascript и удаление строки?

135

У меня есть:

var array = new Array();
array.push("A");
array.push("B");
array.push("C");

Я хочу сделать что-то вроде:

array.remove("B");

но нет функции удаления. Как мне этого добиться?

Роландо
источник
5
Сочетание .indexOf()и .splice()должно помочь. Или, может быть, альтернативно .filter().
Marc B
1
см. здесь: stackoverflow.com/questions/3954438/…
benedict_w

Ответы:

186

На самом деле я обновляю эту ветку более свежим однострочным решением:

let arr = ['A', 'B', 'C'];
arr = arr.filter(e => e !== 'B'); // will return ['A', 'C']

Идея состоит в том, чтобы фильтровать массив, выбирая все элементы, отличные от элемента, который вы хотите удалить.

Примечание: удалит все вхождения.

РЕДАКТИРОВАТЬ:

Если вы хотите удалить только первое появление:

t = ['A', 'B', 'C', 'B'];
t.splice(t.indexOf('B'), 1); // will return ['B'] and t is now equal to ['A', 'C', 'B']
Tyrannas
источник
1
Это решение возвращает копию массива, тогда как использование splice удаляет элемент (ы) на месте. Что вы выберете, зависит от контекста.
twhitehead
6
Это идеально подходит для вещей Redux, где вам нужно вернуть новое состояние.
colinwong
@Regis на самом деле нет, arr.filter возвращает новый массив. Таким образом, arr.filter (e => e! == 'B') не будет изменять arr. А может я не правильно понял ваш комментарий?
Tyrannas 05
есть ли способ сделать это, кроме как остановиться при первом появлении? так что если есть 5 минут, нужно просто удалить один?
Ари
1
@Ari Я обновил ответ об удалении только одного элемента
Tyrannas
171

Прокрутите список в обратном порядке и используйте .spliceметод.

var array = ['A', 'B', 'C']; // Test
var search_term = 'B';

for (var i=array.length-1; i>=0; i--) {
    if (array[i] === search_term) {
        array.splice(i, 1);
        // break;       //<-- Uncomment  if only the first term has to be removed
    }
}

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

Когда нужно удалить только первое вхождение, также будет работать следующее:

var index = array.indexOf(search_term);    // <-- Not supported in <IE9
if (index !== -1) {
    array.splice(index, 1);
}
Роб В
источник
1
Я предполагаю, потому что это должно быть немного быстрее для итерации в обратном направлении.
Ben Clayton
1
@BenClayton: Спасибо. FWIW в JavaScript - это не совсем так. Обратный отсчет 0не происходит автоматически быстрее, как, скажем, в C. Если вы кешируете лимит, конечно, что усложнит ситуацию, если вы продолжите идти после первого совпадения (но не если вы остановитесь на нем).
TJ Crowder
Если мы стремимся к скорости, почему бы не использовать while -? : D
Snuffleupagus
11
Дело не в скорости, он даже об этом говорит в своем ответе. Речь идет о пропуске элементов. Если вы находитесь в позиции 5 и соединяете эту позицию, формовка элемента, расположенная в позиции 6 , теперь находится в позиции 5 . Тем не менее, ваш счетчик циклов увеличивается, следующая итерация - это позиция 6, и именно здесь вы пропустили элемент. Поэтому все в обратном порядке.
amenthes
1
Если вы удаляете элементы в прямом цикле, и элемент удаляется, последняя итерация может вызвать исключения с нулевым указателем, так как он будет ссылаться на несуществующий индекс
Дренай
24

Список One Liners

Решим эту проблему для этого массива:

var array = ['A', 'B', 'C'];

1. Удалите только первый: Используйте Если вы уверены, что элемент существует

array.splice(array.indexOf('B'), 1);

2. Удалите только последнее: используйте, если вы уверены, что элемент существует

array.splice(array.lastIndexOf('B'), 1);

3. Удалите все вхождения:

array = array.filter(v => v !== 'B'); 
enesn
источник
21

DEMO

Вам нужно найти местоположение того, что вы ищете, а .indexOf()затем удалить его с помощью.splice()

function remove(arr, what) {
    var found = arr.indexOf(what);

    while (found !== -1) {
        arr.splice(found, 1);
        found = arr.indexOf(what);
    }
}

var array = new Array();
array.push("A");
array.push("B");
array.push("C");
    
remove(array, 'B');
alert(array)​​​​;

Это позаботится обо всех происшествиях.

qwertymk
источник
Для браузеров, которые не поддерживают, .indexOf()вы можете добавить это в свой файл javascript.
qwertymk
ага, элегантно. Если вам нужна возможность удалить только некоторые элементы, например только первый: то же самое обновлено: jsfiddle.net/qpZFd/9
sebilasse
Я всегда получаю следующее сообщение об ошибке: Uncaught ReferenceError: array is not defined. Что случилось?
Патрос,
Если вы идете по этому маршруту, вы легко можете воспользоваться еще .indexOf()одним преимуществом . Если вы передадите foundв качестве второго аргумента .indexOf()вызов внутри цикла while , элементы в массиве, которые уже были проверены и оказались не равными, не проверяются снова: found = arr.indexOf(what, found);
pimmhogeling
14

Просто

array.splice(array.indexOf(item), 1);
Matt
источник
да, за исключением того, что indexOf вернется, -1если ничего не будет найдено, и упс, splice удалит 1 элемент из конца массива
Рики Спэниш
2

Простое решение (ES6)

Если у вас нет повторяющегося элемента

Array.prototype.remove = function(elem) {
  var indexElement = this.findIndex(el => el === elem);
  if (indexElement != -1)
    this.splice(indexElement, 1);
  return this;
};   

Онлайн-демонстрация (скрипка)

Али Солтани
источник
Это решение всегда удаляет последний элемент, если совпадений НЕТ.
markus s 05
1

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

В качестве альтернативы вы можете создать новый массив, перебрать текущий массив и, если текущий объект не соответствует тому, что вы хотите удалить, поместить его в новый массив.

hvgotcodes
источник
1

использовать:

array.splice(2, 1);

Это удаляет один элемент из массива, начиная с индекса 2 (третий элемент)

Бен Клейтон
источник
1
фактически он удалит второй элемент из массива, индекс начинается с нуля. этот оператор имеет двусмысленность, может быть более простой пример, array.splice(2,1)который удаляет 1 элемент с индексом 2 из массива. проверьте https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice для получения более подробной информации
imdzeeshan
1
const changedArray = array.filter( function(value) {
  return value !== 'B'
});

или вы можете использовать:

const changedArray = array.filter( (value) => value === 'B');

ИзмененныйArray будет содержать без значения 'B'

Шива гопи
источник
0

использовать array.splice

/*array.splice(index , howMany[, element1[, ...[, elementN]]])

array.splice(index) // SpiderMonkey/Firefox extension*/

array.splice(1,1)

Источник: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

chepe263
источник
Запятая между arrayи spliceдолжна быть точкой.
Rob W
Пытался исправить, но политика SO гласит, что редактирование должно содержать не менее 6 символов: /
ben_nuttall