Jak usunąć określoną wartość z tablicy za pomocą jQuery


419

Mam tablicę, która wygląda następująco: var y = [1, 2, 3];

Chciałbym usunąć 2z tablicy y.

Jak mogę usunąć określoną wartość z tablicy za pomocą jQuery? Próbowałem, pop()ale to zawsze usuwa ostatni element.


8
OSTRZEŻENIE : niektóre z najbardziej pozytywnych odpowiedzi mogą mieć skutki uboczne, np. Wykonywanie niewłaściwych operacji, gdy tablica nie zawiera elementu do usunięcia. Używaj ich ostrożnie .
Ricardo

Ta odpowiedź zadziałała dla mnie z prostym javascript: stackoverflow.com/a/5767357/4681687
chimos

zobacz mój komentarz przy użyciu splice () i $ .inArray (), Rozwiązałem ten problem BEZ użycia pętli i jest czysty.
user253780,

Odpowiedzi:


619

Działający JSFIDDLE

Możesz zrobić coś takiego:

var y = [1, 2, 2, 3, 2]
var removeItem = 2;

y = jQuery.grep(y, function(value) {
  return value != removeItem;
});

Wynik:

[1, 3]

http://snipplr.com/view/14381/remove-item-from-array-with-jquery/


2
To dobra wiadomość i tak, potrzebna była odpowiednia modyfikacja :)
Sarfraz

2
Myślę, że odpowiedź @ user113716 dotycząca domyślnej metody JS jest właściwą drogą. Każda metoda natywna będzie zawsze preferowana i szybsza.
neoswf

114
Czy ta odpowiedź nie jest całkowicie błędna? Tworzy nową tablicę z brakującym elementem, a nie usuwa element z tablicy. To wcale nie jest to samo.
James Moore,

5
To usunięcie ze złożonością O (n) ... im więcej wartości w tablicy, tym najgorsze będzie ...
Lyth

2
Złożoność O (n) nie stanowi problemu.
Omar Tariq

370

Za pomocą jQuery możesz wykonywać operacje na jednej linii w następujący sposób:

Przykład: http://jsfiddle.net/HWKQY/

y.splice( $.inArray(removeItem, y), 1 );

Używa natywnego .splice()i jQuery $.inArray().


13
@Elankeeran - Nie ma za co. : o) Należy zauważyć, że spowoduje to usunięcie tylko pierwszej instancji. Jeśli trzeba usunąć wiele, nie zadziała.
user113716,

7
Zmieniłem również parametr removeItem na wartość, która NIE istnieje w tablicy i usunąłem ostatni element w tablicy. Użyj tego, jeśli nie masz pewności co do istnienia removeItem: y = $ .grep (y, function (val) {return val! = RemoveItem;});
Solburn,

52
OSTRZEŻENIE - może usunąć niewłaściwy element! $ .inArray zwraca -1, jeśli wartość nie jest obecna, a .splice traktuje indeks ujemny jako „od końca”, więc jeśli wartość, którą próbujesz usunąć, nie występuje, zamiast niej zostanie usunięta inna wartość. Również $ .grep usunie wszystkie wystąpienia, podczas gdy ta metoda usunie tylko pierwsze.
Ryan Williams

1
Aby rozwiązać oba opisane powyżej problemy, użyj whilepętli i zmiennej tymczasowej w następujący sposób:var found; while ((found = $.inArray(removeItem, y)) !== -1) y.splice(found, 1);

1
Chociaż jest o wiele ładniejszy z ES5 .indexOf()zamiast z jQuery, ponieważ można użyć ostatniego indeksu znalezionego jako punkt wyjścia do następnego wyszukiwania, co jest znacznie wydajniejsze niż przeszukiwanie całej tablicy za każdym razem. var found=0; while ((found = y.indexOf(removeItem, found)) !== -1) y.splice(found, 1);

50

jQuery.filtermetoda jest przydatna. To jest dostępne dla Arrayobiektów.

var arr = [1, 2, 3, 4, 5, 5];

var result = arr.filter(function(elem){
   return elem != 5; 
});//result -> [1,2,3,4]

http://jsfiddle.net/emrefatih47/ar0dhvhw/

W Ecmascript 6:

let values = [1,2,3,4,5];
let evens = values.filter(v => v % 2 == 0);
alert(evens);

https://jsfiddle.net/emrefatih47/nnn3c2fo/


4
Wydaje się, że działa najlepiej spośród proponowanych rozwiązań, nawet jeśli w rzeczywistości nie zmienia istniejącej tablicy, ale tworzy nową. Działa również z nieistniejącymi wartościami lub pustą tablicą. Szybka kontrola wydajności w JSFiddle Zrobiłem: z tablicą z 800.000 wartości zajęło około 6 sekund. Nie jestem pewien, czy to szybko.
Flo,

2
W tym rozwiązaniu zastosowano filtr funkcji JS waniliowego JS, a nie metodę filtru jQuery.
Kalimah

Kocham to! Wydaje się to najlepszym rozwiązaniem, mimo że nie jest to jquery ...
Sam

36

Możesz użyć underscore.js . To naprawdę sprawia, że ​​wszystko jest proste.

W twoim przypadku cały kod, który będziesz musiał napisać to -

_.without([1,2,3], 2);

a wynikiem będzie [1,3].

Redukuje kod, który piszesz.


34

Nie jest to jQuery, ale ... Dlaczego nie użyć prostszego sposobu. Usuń „c” z poniższej tablicy

var a = ['a','b','c','d']
a.splice(a.indexOf('c'),1);
>["c"]
a
["a", "b", "d"]

Możesz także użyć: (Uwaga dla siebie: Nie modyfikuj obiektów, których nie posiadasz )

Array.prototype.remove = function(v) { this.splice(this.indexOf(v) == -1 ? this.length : this.indexOf(v), 1); }
var a = ['a','b','c'];
a.remove('c'); //value of "a" is now ['a','b']

Dodawanie jest prostszea.push('c')


9
Nie działa Usuwa ostatni element w tablicy, jeśli nie został znaleziony.
Timothy Aaron,

7
indexOf nie jest obsługiwany w IE8-.
Boude

1
Działa idealnie, dzięki.
Jay Momaya

22

Usuń element w szyku

var arr = ["jQuery", "JavaScript", "HTML", "Ajax", "Css"];
var itemtoRemove = "HTML";
arr.splice($.inArray(itemtoRemove, arr), 1);

14
//This prototype function allows you to remove even array from array
Array.prototype.remove = function(x) { 
    var i;
    for(i in this){
        if(this[i].toString() == x.toString()){
            this.splice(i,1)
        }
    }
}

Przykład użycia

var arr = [1,2,[1,1], 'abc'];
arr.remove([1,1]);
console.log(arr) //[1, 2, 'abc']

var arr = [1,2,[1,1], 'abc'];
arr.remove(1);
console.log(arr) //[2, [1,1], 'abc']

var arr = [1,2,[1,1], 'abc'];
arr.remove('abc');
console.log(arr) //[1, 2, [1,1]]

Aby użyć tej prototypowej funkcji, musisz ją wkleić w kodzie. Następnie możesz zastosować go do dowolnej tablicy z „notacją kropkową”:

someArr.remove('elem1')

Trochę więcej wyjaśnień nie umknie tutaj!
Gaz Winter

Aby użyć tej prototypowej funkcji, musisz ją wkleić w kodzie. Następnie możesz zastosować go do dowolnej tablicy z „notacją kropkową”, na przykład: someArr.remove ('elem1')
yesnik

3
Jedyny problem z czymś takim jest taki, że zastępuje on metodę usuwania globalnego obiektu Array, co oznacza, że ​​każdy inny kod w projekcie, który zależy od domyślnego zachowania, kończy się błędem.
jmort253

2
Innym problemem jest to, że zmienna globalna izostaje nadpisana.
Roland Illig


5

Możesz użyć .not działa w następujący sposób:

var arr = [ 1 , 2 , 3 , 5 , 8];
var searchValue = 2;

var newArr = $(arr).not([searchValue]).get();

2
Spowoduje to wymazanie całej tablicy, jeśli nie ma tam wartości, więc searchValue = 4 zwróci pustą tablicę.
Julian K,

3
Skopiowałem kod do jsfiddle, zmieniłem searchValuena 4, uruchomiłem kod, nie wykryto żadnego problemu. Wszystkie wartości były nadal obecne. @ JulianK
RST

4

Moja wersja odpowiedzi user113716. Usuwa wartość, jeśli nie znaleziono dopasowania, co nie jest dobre.

var y = [1, 2, 3]
var removeItem = 2;

var i = $.inArray(removeItem,y)

if (i >= 0){
    y.splice(i, 1);
}

alert(y);

To usuwa teraz 1 element, jeśli znaleziono dopasowanie, 0, jeśli nie znaleziono żadnego dopasowania.

Jak to działa:

  • $ .inArray (wartość, tablica) to funkcja jQuery, która znajduje pierwszy indeks pliku value warray
  • Powyższe zwraca -1, jeśli wartość nie zostanie znaleziona, więc sprawdź, czy i jest poprawnym indeksem przed wykonaniem usunięcia. Usunięcie indeksu -1 oznacza usunięcie ostatniego, co tutaj nie jest pomocne.
  • .splice (indeksowe, count) usuwa countliczba wartości zaczynając index, więc po prostu chcą countz1

3
//in case somebody needs something like this:  multidimensional array (two items)

var ar = [[0,'a'],[1,'b'],[2,'c'],[3,'d'],[4,'e'],[5,'f']];

var removeItem = 3;  


ar = jQuery.grep(ar, function(n) {
  return n[0] != removeItem;   //or n[1] for second item in two item array
});
ar;

3

Istnieje proste rozwiązanie z łączeniem. Według W3School składnia splicingu jest następująca;

array.splice(index, howmany, item1, ....., itemX)

indeks Wymagane. Liczba całkowita określająca, w której pozycji dodawać / usuwać elementy. Użyj wartości ujemnych, aby określić pozycję od końca tablicy

ile wymagane Liczba elementów do usunięcia. Jeśli ustawione na 0, żadne elementy nie zostaną usunięte

item1, ..., itemX Opcjonalne. Nowe elementy do dodania do tablicy

Pamiętaj, że następujące js wyskoczy jeden lub więcej pasujących elementów z podanej tablicy, jeśli zostaną znalezione, w przeciwnym razie nie usuną ostatniego elementu tablicy.

var x = [1,2,3,4,5,4,4,6,7];
var item = 4;
var startItemIndex = $.inArray(item, x);
var itemsFound = x.filter(function(elem){
                            return elem == item;
                          }).length;

Lub

var itemsFound = $.grep(x, function (elem) {
                              return elem == item;
                           }).length;

Tak więc finał powinien wyglądać następująco

x.splice( startItemIndex , itemsFound );

Mam nadzieję że to pomoże.


3

Najpierw sprawdza, czy element istnieje w tablicy

$.inArray(id, releaseArray) > -1

powyższa linia zwraca indeks tego elementu, jeśli istnieje on w tablicy, w przeciwnym razie zwraca -1

 releaseArray.splice($.inArray(id, releaseArray), 1);

teraz powyżej linii usunie ten element z tablicy, jeśli zostanie znaleziony. Podsumowując logikę poniżej, wymagany jest kod do sprawdzenia i usunięcia elementu z tablicy.

  if ($.inArray(id, releaseArray) > -1) {
                releaseArray.splice($.inArray(id, releaseArray), 1);
            }
            else {
                releaseArray.push(id);
            }

2

Miałem podobne zadanie, w którym musiałem usunąć wiele obiektów naraz, w oparciu o właściwość obiektów w tablicy.

Po kilku iteracjach kończę na:

list = $.grep(list, function (o) { return !o.IsDeleted });

2

Rozszerzyłbym klasę Array o pick_and_remove()funkcję, taką jak:

var ArrayInstanceExtensions = {
    pick_and_remove: function(index){
        var picked_element = this[index];
        this.splice(index,1);
        return picked_element;
    } 
};
$.extend(Array.prototype, ArrayInstanceExtensions);

Choć może się to wydawać nieco gadatliwe, możesz teraz wywoływać pick_and_remove()dowolną tablicę, którą chcesz!

Stosowanie:

array = [4,5,6]           //=> [4,5,6]
array.pick_and_remove(1); //=> 5
array;                    //=> [4,6]

Możesz to zobaczyć w akcji pokemona tutaj.


2
/** SUBTRACT ARRAYS **/

function subtractarrays(array1, array2){
    var difference = [];
    for( var i = 0; i < array1.length; i++ ) {
        if( $.inArray( array1[i], array2 ) == -1 ) {
                difference.push(array1[i]);
        }
    }
return difference;
}  

Następnie możesz wywołać tę funkcję w dowolnym miejscu kodu.

var I_like    = ["love", "sex", "food"];
var she_likes = ["love", "food"];

alert( "what I like and she does't like is: " + subtractarrays( I_like, she_likes ) ); //returns "Naughty :P"!

Działa to we wszystkich przypadkach i pozwala uniknąć problemów z powyższymi metodami. Mam nadzieję, że to pomaga!


2

Wypróbuj to, działa dla mnie

_clientsSelected = ["10", "30", "12"];
function (removeItem) {
console.log(removeItem);
   _clientsSelected.splice($.inArray(removeItem, _clientsSelected), 1);
   console.log(_clientsSelected);
`enter code here`},

2

Druga najbardziej pozytywna odpowiedź tutaj jest na najbliższym możliwym torze do jednowierszowej metody jQuery zamierzonego zachowania, którego chce OP, ale potknęli się na końcu swojego kodu i ma wadę. Jeśli element, który chcesz usunąć, nie znajduje się w tablicy, ostatni element zostanie usunięty.

Niektórzy zauważyli ten problem, a niektórzy zaproponowali sposoby obejścia tego problemu. Oferuję najkrótszą, najczystszą metodę, jaką mogłem znaleźć, i skomentowałem pod ich odpowiedzią sposób naprawy ich kodu zgodnie z tą metodą.

var x = [1, 2, "bye", 3, 4];
var y = [1, 2, 3, 4];
var removeItem = "bye";

// Removing an item that exists in array
x.splice( $.inArray(removeItem,x), $.inArray(removeItem,x) ); // This is the one-liner used

// Removing an item that DOESN'T exist in array
y.splice( $.inArray(removeItem,y), $.inArray(removeItem,y) ); // Same usage, different array

// OUTPUT -- both cases are expected to be [1,2,3,4]
alert(x + '\n' + y);

tablica x z łatwością usunie element „pa”, a tablica y pozostanie nietknięta.

Użycie argumentu $.inArray(removeItem,array)jako drugiego argumentu w rzeczywistości kończy się na długości splotu. Ponieważ element nie został znaleziony, ocenia to array.splice(-1,-1);, co po prostu spowoduje, że nic nie zostanie połączone ... wszystko bez konieczności pisania w tym celu pętli.


1

Aby bezpiecznie usunąć 2 z tablicy za pomocą waniliowego JavaScript:

// Define polyfill for browsers that don't natively support Array.indexOf()
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {
    var k;
    if (this===null) {
      throw new TypeError('"this" is null or not defined');
    }
    var O = Object(this),
      len = O.length >>> 0;
    if (len===0) return -1;
    var n = +fromIndex || 0;
    if (Math.abs(n)===Infinity) n = 0;
    if (n >= len) return -1;
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
    while (k < len) {
      if (k in O && O[k]===searchElement) return k;
      ++k;
    }
    return -1;
  };
}

// Remove first instance of 2 from array
if (y.indexOf(2) > -1) {
  y.splice(y.indexOf(2), 1);
}

/* To remove all instances of 2 from array, change 'if' to 'while':
while (y.indexOf(2) > -1) {
  y.splice(y.indexOf(2), 1);
}
*/

console.log(y);  // Returns [1, 3]

Źródło Polyfill: Mozilla


0

Żeby dodać odpowiedź Sarfraza, zdziwiłem się, że nikt nie zrobił jeszcze funkcji.

Użyj odpowiedzi z ddagsan przy użyciu metody .filter, jeśli masz tę samą wartość więcej niż jeden raz w tablicy.

function arrayRemoveVal(array, removeValue){
	var newArray = jQuery.grep(array, function(value) {return value != removeValue;});
	return newArray;
}
var promoItems = [1,2,3,4];	
promoItems = arrayRemoveVal(promoItems, 3);// removes 3
console.log(promoItems);
promoItems = arrayRemoveVal(promoItems, 3);// removes nothing
console.log(promoItems);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.