SORU
15 Mart 2011, Salı


Başka bir dizi konumdan bir dizi öğe taşımak

Zor zamanlar bir dizi öğe taşımak için nasıl sergiyi yaşıyorum. Aşağıdaki verilen örnek için:

var arr = [ 'a', 'b', 'c', 'd', 'e'];

Nasıl 'd' 'b' Daha önce taşımak için bir fonksiyon yazabilirim?

Veya 'a' 'c' sonra?

Hareket sonra, geriye kalan elementler endeksleri güncellenmelidir. Bu anlamda ilk örnek sonra hareket arr[0] = 'a', arr[1] = 'd' arr[2] = 'b', dizi[3] = 'c', dizi[4] = 'e'

Bu oldukça basit olmalı gibi görünüyor, ama bunu kavramaya edemem.

CEVAP
15 Mart 2011, Salı


Bu işlevi ile oldukça iyi bir başarı elde etti:

Array.prototype.move = function (old_index, new_index) {
    if (new_index >= this.length) {
        var k = new_index - this.length;
        while ((k--)   1) {
            this.push(undefined);
        }
    }
    this.splice(new_index, 0, this.splice(old_index, 1)[0]);
    return this; // for testing purposes
};

Örnek kod: [1, 2, 3].move(0, 1) [2, 1, 3] verir.

return en son sadece test amaçlı olduğunu unutmayın: splice yerinde dizi operasyon gerçekleştiren bir dönüş gerekli değildir. Ek olarak, bu move yerinde bir işlemdir. Eğer bunu önlemek ve bir kopyasını geri dönmek isterseniz, slice kullanın.

Kod boyunca adım:

  1. Eğer new_index dizi uzunluğu büyükse, istiyoruz (sanırım) dizisi düzgün yeni ped undefinedler. Bu küçük parçacığı doğru uzunluğu kadar dizi undefined iterek bu işler.
  2. Sonra, this.splice(old_index, 1)[0], eski elementi birleşme. splice işlenmiş olduğunu öğesi döndürür, ama bir dizi. Örneğin bizim yukarıda, bu [1]. Bu dizi ilk endeks 21 ** ham oraya götürelim.
  3. Ardından splice English ... bu öğe eklemek için kullanırız. Biz dizinin üstünde new_index > this.length, yastıklı beri muhtemelen bir şey negatif bir sayı geçmesi gibi tuhaf yaptıkları sürece doğru yerde görünür.

Olumsuz endeksleri hesaba meraklısı bir versiyonu:

Array.prototype.move = function (old_index, new_index) {
    while (old_index < 0) {
        old_index  = this.length;
    }
    while (new_index < 0) {
        new_index  = this.length;
    }
    if (new_index >= this.length) {
        var k = new_index - this.length;
        while ((k--)   1) {
            this.push(undefined);
        }
    }
    this.splice(new_index, 0, this.splice(old_index, 1)[0]);
    return this; // for testing purposes
};

[1, 2, 3, 4, 5].move(-1, -2) düzgün gibi şeyler (son yer, ikinci için son öğe taşımak için hesap gerekir. Bunun için sonuç [1, 2, 3, 5, 4] olmalıdır.

Her iki şekilde de, asıl soru, senin yapacağın c sonra a arr.move(0, 2). b daha önce d arr.move(3, 1).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kevin Bruckert

    Kevin Brucke

    30 Aralık 2006
  • RogerBuckChrist

    RogerBuckChr

    9 Temmuz 2011
  • SoundHound

    SoundHound

    8 Mart 2006