2010-03-14 2 views
55

Demek, şöyle bir dizi var?yeniden sıralama diziler

Örneğin, {artist:"Lalo Schifrin", title:"Shifting Gears"} sonuna taşımak istiyorum.

böyle, birleşme kısmı kullanılarak çalıştı:

var tmp = playlist.splice(2,1); 
playlist.splice(2,0,tmp); 

Ama çalışmıyor.

+3

- bu bir hata atmak yok, hiçbir şey değişir mi, bu bir şekilde diziyi değiştirir sen niyetim yoktu Bana mantıklı görünüyor. –

cevap

2

eleman çıkarmadan ekleme çağrısında ilk parametre olarak 1 Değişim 2: rekor şu anda nerede olduğunu bilmiyorsanız

var tmp = playlist.splice(1,1); 
playlist.splice(2,0,tmp); 
+0

, playlist.splice (2,0, tmp [0]) olmalıdır; Sağ? – Crisboot

2

Hep, sıralama yöntemini kullanabilirsiniz:

Eğer dizinleri biliyorsanız
playlist.sort(function (a, b) { 
    return a.artist == "Lalo Schifrin" 
       ? 1 // Move it down the list 
       : 0; // Keep it the same 
}); 
+1

Zeki. Bunu sevdim. – Gaelan

+0

Geri dönüşü (terim == "Lalo Schifrin") ' – Funkodebat

+1

@ Funko hakkında ne yapabilirsiniz? –

15

kolayca bu gibi basit bir fonksiyonu ile, elemanları takas olabilir:

function swapElement(array, indexA, indexB) { 
    var tmp = array[indexA]; 
    array[indexA] = array[indexB]; 
    array[indexB] = tmp; 
} 

swapElement(playlist, 1, 2); 
// [{"artist":"Herbie Hancock","title":"Thrust"}, 
// {"artist":"Faze-O","title":"Riding High"}, 
// {"artist":"Lalo Schifrin","title":"Shifting Gears"}] 

Dizi dizinleri yalnızca dizi nesnesinin özellikleridir, bu nedenle değerlerini değiştirebilirsiniz.

Array.splice sözdizimi
137

olduğunu :

yourArray.splice(index, howmany, element1, /*.....,*/ elementX); 

: kaç olduğunu howmany

  • endeksi dizide konumunu size
  • öğeleri kaldırarak başlamak istiyorum kaldırmak istediğiniz öğeler dizin
  • element1, ..., elementX, dizin dizinine eklemek istediğiniz öğelerdir.

Bu, splice() öğesinin, geçiş yaptığınız bağımsız değişkenlere bağlı olarak öğeleri kaldırmak, eleman eklemek veya öğeleri bir dizide değiştirmek için kullanılabileceği anlamına gelir.

Kaldırılan öğelerin bir dizisini döndürdüğünü unutmayın.

güzel ve jenerik bir şey olacaktır:

Array.prototype.move = function (from, to) { 
    this.splice(to, 0, this.splice(from, 1)[0]); 
}; 

Sonra sadece kullanın:

var ar = [1,2,3,4,5]; 
ar.move(0,3); 
alert(ar) // 2,3,4,1,5 

Şema:

Algorithm diagram

+9

Bu iyi bir yanıttır ve ekleme() içindeki ek yeri() işi iyi yapar. Bununla birlikte, Array prototipine bir move() yönteminin eklenmesinin "Maymun Yaması" olarak adlandırıldığına ve tipik olarak kötü uygulama olarak kabul edildiğine dikkat edilmelidir. http://stackoverflow.com/questions/5741877/is-monkey-patching-really-that-bad –

1

bu deneyin:

Eğer sadece hiç dizinin sonuna keyfi bir pozisyondan bir öğe taşımak istiyorsanız
1

, bu çalışması gerekir:

function toEnd(list, position) { 
    list.push(list.splice(position, 1)); 
    return list; 
} 

Sonuna bazı keyfi pozisyona birden fazla öğe taşımak istiyorsanız, yapabileceğiniz:

function toEnd(list, from, count) { 
    list.push.apply(list, list.splice(from, count)); 
    return list; 
} 

bazı keyfi pozisyona bazı keyfi pozisyona birden fazla öğe taşımak isterseniz

, deneyin:

function move(list, from, count, to) { 
    var args = [from > to ? to : to - count, 0]; 
    args.push.apply(args, list.splice(from, count)); 
    list.splice.apply(list, args); 

    return list; 
} 
5
İşte

ilgilenenler için değişmez bir versiyonudur: Ne demek "çalışmıyor" yok

function immutableMove(arr, from, to) { 
    return arr.reduce((prev, current, idx, self) => { 
    if (from === to) { 
     prev.push(current); 
    } 
    if (idx === from) { 
     return prev; 
    } 
    if (from < to) { 
     prev.push(current); 
    } 
    if (idx === to) { 
     prev.push(self[from]); 
    } 
    if (from > to) { 
     prev.push(current); 
    } 
    return prev; 
    }, []); 
} 
+0

Merhaba, yukarıdaki işlev üzerinden bu işlevin faydalarını bana açıklayabilir misiniz? – Xogno

+0

Bu çözüm, özgün öğeyi değiştirmez, ancak taşınan girdiyle yeni bir dizi döndürür. – chmanie