JavaScript'teki bir diziden öğe nasıl kaldırılır?


340
var arr = [1,2,3,5,6];

İlk elemanı kaldır

Böylece dizinin ilk öğesini kaldırmak istiyorum:

var arr = [2,3,5,6];

İkinci elemanı kaldır

Bu soruyu genişletmek için, dizinin ikinci öğesini kaldırmak istiyorsanız:

var arr = [1,3,5,6];

1
slice(start, end)değil 'how_many_to_remove'
seanjacob

2
@Ped arr.unshift () KALDIRMAZ, ancak "Bir dizinin başına bir veya daha fazla öğe ekler"
psycho brm

@seanjacob sanırım splicedeğil slice.
Animesh Singh

Yanıtlar:


346

Daha esnek bir çözüm için splice()işlevi kullanın . Dizin Değerine dayalı olarak bir Dizideki herhangi bir öğeyi kaldırmanıza olanak tanır:

var indexToRemove = 0;
var numberToRemove = 1;

arr.splice(indexToRemove, numberToRemove);

12
Ve takip eden soru: arr.splice(1,1)ikinci eleman için.
slebetman

1
Tercihim splice()üzerinde shift()onun daha esnek çünkü. Gelecekte farklı bir şey yapmak isteyebilirim ve her zaman sadece bir elemanı, hatta ilk elemanı kaldırmak istemiyorum.
Gabriel McAdams

14
Buraya Google'dan gelirseniz: Gabriel bu yanıtı tercih eder, ancak vardiya () olduğunu da bilmelisiniz, Joseph'in cevabına bakın.
SHernandez

668

shift()durumunuz için idealdir. shift()bir dizideki ilk öğeyi kaldırır ve o öğeyi döndürür. Bu yöntem dizinin uzunluğunu değiştirir.

array = [1, 2, 3, 4, 5];

array.shift(); // 1

array // [2, 3, 4, 5]

Bu çalışır, ancak dizideki yalnızca ilk öğeyi kaldırır.
Gabriel McAdams

53
@ Gabriel: soru tam olarak bu değil miydi? Çok daha açık, doğrudan olduğu shift()için tercih ederim splice(..., ...).
Bruno Reis

6
Düzeltme:
Sağladığınız

Kod örneği doğru olsa da, açıklama yanıltıcıdır: (a) @DanH'ın işaret ettiği gibi, döndürülen ilk öğedir ve (b) giriş dizisinin değiştirildiği gerçeği netleştirilmemiştir. Bu nedenle Ped'in cevabı üstündür.
mklement0

2
shiftbüyük listeleri eklemediğiniz sürece daha hızlıdır jsperf.com/splice-vs-shift3 ve jsperf.com/splice-vs-shift2
kcathode

61

Array.prototype.shiftYöntem, bir dizi ilk öğesini kaldırır, ve döndürür. Orijinal diziyi değiştirir.

var a = [1,2,3]
// [1,2,3]
a.shift()
// 1
a
//[2,3]

4
Joseph Silvashy'nin cevabında büyük bir gelişme - açıklama ve kod arasında tutarsızlık yok.
mklement0

48
arr.slice(begin[,end])

tahribatsız, ekleme ve kaydırma orijinal dizinizi değiştirir


3
Mutasyon geçirmeyenler için evet. Bu daha görünür olmalıdır.
kullanıcı

16

Javascript Arrays'da rastgele konumlara eleman ekleme ve silme hakkında küçük bir makale yazdı.

Bir öğeyi herhangi bir konumdan kaldırmak için küçük snippet. Bu, Javascript'teki Array sınıfını genişletir ve remove (index) yöntemini ekler.

// Remove element at the given index
Array.prototype.remove = function(index) {
    this.splice(index, 1);
}

Örneğinizdeki ilk öğeyi kaldırmak için arr.remove () öğesini çağırın:

var arr = [1,2,3,5,6];
arr.remove(0);

İkinci öğeyi kaldırmak için,

arr.remove(1);

İşte Array sınıfı için ekleme ve silme yöntemlerine sahip küçük bir makale .

Temelde bu, splice kullanan diğer cevaplardan farklı değildir, ancak isim splicesezgisel değildir ve uygulamanız genelinde bu çağrıyı yaparsanız, kodun okunmasını zorlaştırır.



7

Diğerleri cevaplar Sadece ile alternatif bir çözüm eklemek istedim, büyük ES6Dizisi fonksiyonu: filter.

filter() varolan bir diziden belirli bir ölçüt kapsamına giren öğeleri içeren yeni bir dizi oluşturur.

Böylece ölçütleri geçmeyen öğeleri kaldırmak için kolayca kullanabilirsiniz. Bu işlevin faydaları, yalnızca dize ve sayı değil karmaşık dizide kullanabilmenizdir.

Bazı örnekler :

İlk elemanı kaldır :

// Not very useful but it works
function removeFirst(element, index) {
  return index > 0;
}
var arr = [1,2,3,5,6].filter(removeFirst); // [2,3,4,5,6]

İkinci elemanı kaldır :

function removeSecond(element, index) {
  return index != 1;
}
var arr = [1,2,3,5,6].filter(removeSecond); // [1,3,4,5,6]

Tek öğeyi kaldır :

function removeOdd(element, index) {
  return !(element % 2);
}
var arr = [1,2,3,5,6].filter(removeOdd); [2,4,6]

Stokta olmayan eşyaları kaldır

const inventory = [
  {name: 'Apple', qty: 2},
  {name: 'Banana', qty: 0},
  {name: 'Orange', qty: 5}
];

const res = inventory.find( product => product.qty > 0);


2

Bir dinlenme operatörü ile ES6 Yıkım Ataması özelliğini kullanabilirsiniz. Virgül, dizinin kalan öğelerini vermek için öğeyi ve geri kalan (... arr) operatörünü kaldırmak istediğiniz yeri gösterir.

const source = [1,2,3,5,6];

function removeFirst(list) {
   var  [, ...arr] = list;
   return arr;
}
const arr = removeFirst(source);
console.log(arr); // [2, 3, 5, 6]
console.log(source); // [1, 2, 3, 5, 6]


1

Array.splice()ilk öğeyi kaldırmak için kullanamayacağı ilginç bir özelliğe sahiptir. Bu yüzden,

function removeAnElement( array, index ) {
    index--;

    if ( index === -1 ) {
        return array.shift();
    } else {
        return array.splice( index, 1 );
    }
}

3
Array.splice (0,1) ilk öğeyi kaldırır. Buradaki diğer tüm cevaplara göre ve developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… . Ayrıca, birileri neden ilk elemanı çıkarmak için -1'i geçsin? 0'ı geçemezler mi?
taş

@skypecakes 0. endekste eklemenin geçerliliği hakkında konuşamam, ancak burada indeks bu kontrolden önce azaltılır, bu yüzden geçtiğinde 0 olur.
Jake T.

Evet, kesinlikle ilk elementi kaldırabilir. Burada test ettim: jsfiddle.net/sijpkes/d87rcLob/2
sijpkes

1

Orijinal diziyi değiştirmeyen daktilo çözümü

function removeElementAtIndex<T>(input: T[], index: number) {
  return input.slice(0, index).concat(input.slice(index + 1));
}

1

Bir öğeyi Diziden kaldırmanın birden çok yolu vardır. Aşağıda en çok kullanılan seçenekleri belirteyim. Bu yanıtı yazıyorum çünkü tüm bu seçeneklerden ne kullanacağım konusunda uygun bir neden bulamadım. Sorunun cevabı seçenek 3'tür ( Splice () ).

1) SHIFT () - İlk Öğeyi Orijinal Diziden Kaldır ve İlk Öğeyi Döndür

Array.prototype.shift () için referansa bakın . Bunu yalnızca ilk öğeyi kaldırmak istiyorsanız ve yalnızca orijinal diziyi değiştirme konusunda sorun yaşıyorsanız kullanın.

const array1 = [1, 2, 3];

const firstElement = array1.shift();

console.log(array1);
// expected output: Array [2, 3]

console.log(firstElement);
// expected output: 1

2) SLICE () - Başlangıç ​​Dizini ve Bitiş Dizini ile Ayrılmış Dizinin Bir Kopyasını Döndürür

Array.prototype.slice () için referansa bakın . Bu seçenekten belirli bir öğeyi kaldıramazsınız. Sadece mevcut diziyi dilimleyebilir ve dizinin sürekli bir bölümünü alabilirsiniz. Diziyi belirttiğiniz dizinlerden kesmek gibidir. Orijinal dizi etkilenmez.

const animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];

console.log(animals.slice(2));
// expected output: Array ["camel", "duck", "elephant"]

console.log(animals.slice(2, 4));
// expected output: Array ["camel", "duck"]

console.log(animals.slice(1, 5));
// expected output: Array ["bison", "camel", "duck", "elephant"]

3) SPLICE () - Belirli Dizinlerdeki Öğeleri Kaldırıp Değiştirerek Dizinin İçeriğini Değiştirir.

Array.prototype.splice () için referansa bakın . Splice () yöntemi, var olan öğeleri kaldırarak veya değiştirerek ve / veya yerine yeni öğeler ekleyerek bir dizinin içeriğini değiştirir. Güncellenmiş diziyi döndürür. Orijinal dizi güncellenir.

const months = ['Jan', 'March', 'April', 'June'];
months.splice(1, 0, 'Feb');
// inserts at index 1
console.log(months);
// expected output: Array ["Jan", "Feb", "March", "April", "June"]

months.splice(4, 1, 'May');
// replaces 1 element at index 4
console.log(months);
// expected output: Array ["Jan", "Feb", "March", "April", "May"]

0

Bunu azaltmak ile de yapabilirsiniz:

let arr = [1, 2, 3]

arr.reduce((xs, x, index) => {
        if (index == 0) {
            return xs
        } else {
            return xs.concat(x)
        }
    }, Array())

// Or if you like a oneliner
arr.reduce((xs, x, index) => index == 0 ? xs : xs.concat(x), Array())
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.