2010-03-14 10 views
55

Powiedz, mam tablicę, która wygląda tak:Zmiana kolejności tablice

var playlist = [ 
    {artist:"Herbie Hancock", title:"Thrust"}, 
    {artist:"Lalo Schifrin", title:"Shifting Gears"}, 
    {artist:"Faze-O", title:"Riding High"} 
]; 

Jak mogę przenieść element do innej pozycji?

Chcę przenieść na przykład {artist:"Lalo Schifrin", title:"Shifting Gears"} do końca.

Próbowałem za pomocą sklejenia, tak:

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

Ale to nie działa.

+3

Co to znaczy „nie działa” oznacza - to wygeneruje błąd, nie zmienia nic, nie zmienia swoją tablicę w sposób nie zamierzałeś? Wydaje mi się to rozsądne. –

Odpowiedz

2

Zmiana 2 na 1, jako pierwszy parametr w wywołaniu spawów podczas usuwania elementu:

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

powinien to być playlist.splice (2,0, tmp [0]); Dobrze? – Crisboot

2

Zawsze możesz użyć metody sortowania, jeśli nie wiem, gdzie płyta jest w chwili obecnej:

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

Sprytny. Lubię to. – Gaelan

+0

Co powiesz na 'return + (a.artist ==" Lalo Schifrin ")' – Funkodebat

+1

@Funko możesz to zrobić, jeśli wolisz zwięzłość nad gadatliwością. –

15

Jeśli znasz indeksów można łatwo zamienić elementy, z prostych funkcji takich jak to:

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

Indeksy tablicowe są tylko właściwościami obiektu tablicy, więc można zamienić jego wartości.

137

Składnia Array.splice jest:

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

Gdzie:

  • Indeks jest położenie w tablicy chcesz rozpocząć usuwanie elementów z
  • howmany jest ile elementy, które chcesz usunąć z indeks
  • element1, ..., elementX to elementy, które chcesz wstawić z pozycji indeks.

Oznacza to, że można użyć splice() do usuwania elementów, dodawania elementów lub zastępowania elementów w tablicy, w zależności od przekazywanych argumentów.

Zwróć uwagę, że zwraca tablicę usuniętych elementów.

Coś miłego i generycznych byłoby:

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

Następnie wystarczy użyć:

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

Diagram:

Algorithm diagram

+9

To jest dobra odpowiedź, a splice() w splice() działa dobrze. Należy jednak zauważyć, że dodanie metody move() do prototypu Array nosi nazwę "Monkey Patching" i jest zazwyczaj uważane za złą praktykę. http://stackoverflow.com/questions/5741877/is-monkey-patching-really-that-bad –

1

Spróbuj tego:

playlist = playlist.concat(playlist.splice(1, 1)); 
1

Jeśli tylko kiedykolwiek chcesz przenieść jeden element z dowolnej pozycji do końca tablicy, to powinno działać:

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

Jeśli chcesz przenieść kilka pozycji z jakiejś dowolnej pozycji do końca, można zrobić:

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

Jeśli chcesz przenieść kilka pozycji z jakiejś dowolnej pozycji do jakiejś dowolnej pozycji, spróbuj:

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

Oto niezmienna wersja dla tych, którzy są zainteresowani:

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

Witam, czy mógłbyś wyjaśnić mi zalety tej funkcji w stosunku do powyższej odpowiedzi? – Xogno

+0

To rozwiązanie nie modyfikuje oryginalnego elementu, ale zwraca nową tablicę z przenoszonym wpisem. – chmanie

Powiązane problemy