Пошук і видалення рядка з масиву Javascript?


134

У мене є:

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

Я хочу вміти робити щось на кшталт:

array.remove("B");

але немає функції видалення. Як я це досягну?


5
Поєднання .indexOf()і .splice()повинно зробити трюк. Або, можливо, альтернативно .filter().
Марк Б


Відповіді:


186

Я фактично оновлюю цей потік більш сучасним рішенням на 1 рядок:

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']

1
Це рішення повертає копію масиву, тоді як за допомогою сплайсу видаляє елементи (и) на місце. Який ви обираєте, залежить від контексту.
twhitehead

6
Це ідеально підходить для матеріалів Redux, де вам потрібно повернути новий стан.
colinwong

@Regis насправді ні, arr.filter повертає новий масив. Отже, arr.filter (e => e! == 'B') не змінить arr. А може, я неправильно зрозумів ваш коментар?
Тирани

чи є метод зробити це, окрім як зупинитись на першій появі? Так що якщо Theres 5 'B' просто видалити один?
Арі

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
Я здогадуюсь, тому що це означає, щоб трохи швидше повторити зворотний бік.
Бен Клейтон

1
@BenClayton: Дякую FWIW, у JavaScript це не достовірно. Відлік до 0автоматично не відбувається швидше, як це, скажімо, C. До тих пір, поки ви кешуєте межу, звичайно, що ускладнить справи, якщо ви продовжуватимете після першого матчу (але не, якщо ви зупинитесь на ньому).
TJ Crowder

Якщо ми їдемо за швидкістю, то чому б не використати час -? : D
Snuffleupagus

11
Справа не в швидкості, він навіть так говорить у своїй відповіді. Йдеться про елементи SKIPPING. Якщо ви перебуваєте в положенні 5 і ви зрощуєте це положення, формуляр елемента, розташований у позиції 6 , зараз знаходиться в 5 . Однак ваш лічильник циклів збільшується, наступна ітерація - це позиція 6, і саме там ви пропустили елемент. Ось чому це в зворотному порядку.
амент

1
Якщо ви видалите елементи в прямому циклі, і елемент буде видалений, остання ітерація може викинути нульові винятки вказівника, оскільки це буде посилання на індекс, який не існує
Drenai

24

Список одного вкладиша

Давайте вирішимо цю проблему для цього масиву:

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'); 

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)​​​​;

Це подбає про всі події.


Для браузерів, які не підтримують, .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);

так, за винятком того, що indexOf повернеться, -1якщо нічого не буде знайдено та озвучено, сплайс видалить 1 елемент із кінця масиву
Ricky Spanish

2

Просте рішення (ES6)

Якщо у вас немає дублікату елемента

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

Демонстрація в Інтернеті (скрипка)


Це рішення завжди видаляє останній елемент, якщо не знайдено відповідності NO.
markus s

1

Ви повинні написати власне видалення. Ви можете перевести цикл на масив, захопити індекс елемента, який потрібно видалити, і використати його spliceдля видалення.

Крім того, ви можете створити новий масив, перевести цикл на поточний масив, і якщо поточний об'єкт не відповідає тому, що ви хочете видалити, помістіть його в новий масив.


1

використання:

array.splice(2, 1);

Це видаляє один елемент з масиву, починаючи з індексу 2 (3-й елемент)


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');

Змінений масив міститиме значення "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


Кома між arrayта spliceмає бути крапкою.
Роб Ш

Намагався виправити, але політика SO вказує, що правки повинні містити 6 символів або більше: /
ben_nuttall
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.