Javascript dizi arama ve dizeyi kaldırma?


135

Sahibim:

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

Şöyle bir şey yapabilmek istiyorum:

array.remove("B");

ancak kaldırma işlevi yoktur. Bunu nasıl başarırım?


5
Bir kombinasyonu .indexOf()ve .splice()hile yapmalı. Veya belki alternatif olarak .filter().
Marc B


Yanıtlar:


186

Aslında bu konuyu daha yeni bir 1 satırlık çözümle güncelliyorum:

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

Temelde fikir, kaldırmak istediğiniz öğeden farklı tüm öğeleri seçerek diziyi filtrelemektir.

Not: tüm oluşumları kaldıracaktır.

DÜZENLE:

Yalnızca ilk geçtiği yeri kaldırmak istiyorsanız:

t = ['A', 'B', 'C', 'B'];
t.splice(t.indexOf('B'), 1); // will return ['B'] and t is now equal to ['A', 'C', 'B']

1
Bu çözüm dizinin bir kopyasını döndürür, oysa splice kullanmak elemanları yerinde kaldırır. Hangisini seçeceğiniz bağlama bağlıdır.
twhitehead

6
Bu, yeni bir duruma geri dönmeniz gereken Redux işleri için mükemmeldir.
colinwong

@Regis aslında değil, arr.filter yeni bir dizi döndürür. Yani arr.filter (e => e! == 'B') arr'ı değiştirmeyecek. Ya da belki yorumunuzu doğru anlamadım?
Tyrannas

Bunu yapmanın ama ilk seferde durmanın bir yöntemi var mı? yani sadece birini kaldırmak için 5 'B varsa?
Ari

1
@Ari Yalnızca bir öğeyi kaldırmanın cevabını güncelledim
Tyrannas

171

Listede ters sırayla döngü yapın ve .spliceyöntemi kullanın .

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
    }
}

Ters sıra, arama teriminin tüm oluşumlarının kaldırılması gerektiğinde önemlidir. Aksi takdirde, sayaç artacak ve öğeleri atlayacaksınız.

Yalnızca ilk oluşumun kaldırılması gerektiğinde, aşağıdakiler de işe yarayacaktır:

var index = array.indexOf(search_term);    // <-- Not supported in <IE9
if (index !== -1) {
    array.splice(index, 1);
}

1
tahmin ediyorum çünkü ters yönde yinelemenin biraz daha hızlı olması gerekiyor.
Ben Clayton

1
@BenClayton: Teşekkürler. FWIW, JavaScript'te bu güvenilir bir şekilde doğru değil. Geri sayım 0, örneğin C'deki gibi otomatik olarak daha hızlı değildir. Sınırı önbelleğe aldığınız sürece, tabii ki, ilk maçtan sonra devam ederseniz işleri karmaşıklaştırır (ama üzerinde durursanız değil).
TJ Crowder

Hız istiyorsak neden süre kullanmayalım -? : D
Snuffleupagus

11
Hızla ilgili değil, hatta cevabında öyle söylüyor. SKIPPING öğeleriyle ilgili. Konum 5'teyseniz ve bu konumu birleştirirseniz, konum 6'da bulunan eleman kalıbı şimdi 5'tedir . Yine de döngü sayacınız artar, bir sonraki yineleme konum 6'dır ve bu, bir öğeyi atladığınız yerdir. Bu yüzden ters sırada.
amenthes

1
Bir ileri döngüdeki öğeleri kaldırırsanız ve bir öğe kaldırılırsa, son yineleme, mevcut olmayan bir dizine referans vereceği için boş işaretçi istisnaları atabilir
Drenai

24

Bir Gömlek Listesi

Bu problemi bu dizi için çözelim:

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

1. Yalnızca ilkini kaldırın: Kullanın Öğenin mevcut olduğundan eminseniz

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

2. Yalnızca sonuncuyu kaldırın: Kullan Öğenin mevcut olduğundan eminseniz

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

3. Tüm oluşumları kaldırın:

array = array.filter(v => v !== 'B'); 

21

DEMO

Aradığınız şeyin yerini bulmanız ve .indexOf()ardından onu kaldırmanız gerekir..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)​​​​;

Bu, tüm olayları halledecektir.


Desteklemeyen tarayıcılar için .indexOf()ekleyebilir Bu sizin javascript dosyasına.
qwertymk

evet, zarif. Yalnızca bazı öğeleri kaldırmak için bir seçeneğe ihtiyacınız varsa, örneğin yalnızca ilk: aynı güncellendi: jsfiddle.net/qpZFd/9
sebilasse

Hep aşağıdaki hatayı alıyorum: Uncaught ReferenceError: array is not defined. Yanlış olan ne?
Pathros

Bu rotaya gidiyorsanız .indexOf()biraz daha fazlasından kolayca yararlanabilirsiniz . Eğer başarılı olursa found, ikinci argüman olarak .indexOf()çağrı sırasında-döngü içinde , dizideki elemanları zaten kontrol edildi ve bitti eşit tekrar kontrol edilmez ediliyor olmadığını: found = arr.indexOf(what, found);
pimmhogeling

14

basitçe

array.splice(array.indexOf(item), 1);

evet, ancak indexOf -1hiçbir şey bulunmazsa dönecek ve haykıracak, splice dizinin sonundan 1 öğeyi silecek
Ricky İspanyolca

2

Basit çözüm (ES6)

Yinelenen öğeniz yoksa

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

Çevrimiçi demo (keman)


Bu çözüm, NO eşleşmesi bulunursa her zaman son öğeyi kaldırır.
markus

1

Kendi çıkartmanızı yazmalısınız. Dizi üzerinde döngü oluşturabilir, kaldırmak istediğiniz öğenin dizinini alabilir ve spliceonu kaldırmak için kullanabilirsiniz .

Alternatif olarak, yeni bir dizi oluşturabilir, mevcut dizi üzerinde döngü oluşturabilir ve mevcut nesne kaldırmak istediğiniz şeyle eşleşmezse, onu yeni bir diziye koyabilirsiniz.



1
const changedArray = array.filter( function(value) {
  return value !== 'B'
});

veya kullanabilirsiniz:

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

DeğiştirilenArray, 'B' değerini içermez


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.