2010-03-14 11 views
55

Sag mal, ich habe ein Array, das wie folgt aussieht:Neuordnen Arrays

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

Wie kann ich ein Element in einer anderen Position zu bewegen?

Ich möchte zum Beispiel {artist:"Lalo Schifrin", title:"Shifting Gears"} bis zum Ende verschieben.

Ich versuchte Spleiß verwenden, wie folgt aus:

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

Aber es funktioniert nicht.

+3

Was bedeutet „funktioniert nicht“ - ein Fehler wirft, wird es nichts ändern, wird es Ihr Array, das Sie in einer Weise ändern nicht beabsichtigt? Es sieht vernünftig für mich aus. –

Antwort

2

ändern 2 bis 1 als ersten Parameter in dem Spleiß Anruf, wenn das Element zu entfernen:

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

sollte es playlist.splice sein (2,0, tmp [0]); Recht? – Crisboot

2

Sie immer die Sortiermethode verwenden können, wenn Sie nicht wissen, wo der Datensatz derzeit ist:

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

Clever. Ich mag das. – Gaelan

+0

Was ist mit 'return + (a.artist ==" Lalo Schifrin ")' – Funkodebat

+1

@Funko könnte man das machen, wenn man die Kürze gegenüber der Ausführlichkeit bevorzugt. –

15

Wenn Sie die Indizes kennen könnte man leicht die Elemente austauschen, mit einer einfachen Funktion wie folgt aus:

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

Array-Indizes sind nur Eigenschaften des Array-Objekts, daher können Sie seine Werte austauschen.

137

Die Syntax von Array.splice ist:

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

Wo:

  • Index die Position im Array Sie Elemente aus
  • Entfernen starten wollen howmany ist, wie viele Elemente, die Sie entfernen möchten von Index
  • element1, ..., elementX sind Elemente, die aus der Position index eingefügt werden sollen.

Dies bedeutet, dass splice() Elemente zu entfernen, verwendet werden kann, Elemente hinzuzufügen oder zu ersetzen Elemente in einem Array in Abhängigkeit von den Argumenten Sie übergeben.

Beachten Sie, dass es ein Array der entfernten Elemente zurückgibt.

Etwas schön und Generika wäre:

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

Dann benutzen Sie einfach:

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

Diagramm:

Algorithm diagram

+9

Dies ist eine gute Antwort, und der Spleiß() in einem Spleiß() macht die Arbeit gut. Es sollte jedoch angemerkt werden, dass das Hinzufügen einer move() -Methode zum Array-Prototyp "Monkey Patching" genannt wird und üblicherweise als schlechte Praxis angesehen wird. http://stackoverflow.com/questions/5741877/is-monkey-patching-really-that-bad –

1

Try this:

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

Wenn Sie immer nur ein Element aus einer beliebigen Position bis zum Ende des Arrays verschieben mögen, sollte diese Arbeit:

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

Wenn Sie mehrere Elemente aus einer beliebigen Position bis zum Ende bewegen mögen, Sie tun können:

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

Wenn Sie mehrere Elemente aus einer beliebigen Position in einer beliebigen Position, versuchen Sie verschieben möchten:

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

Hier ist eine unveränderliche Version für diejenigen, die interessiert sind:

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

Hallo, können Sie mir die Vorteile dieser Funktion über die obige Antwort erklären? – Xogno

+0

Diese Lösung ändert nicht das ursprüngliche Element, sondern gibt ein neues Array mit dem verschobenen Eintrag zurück. – chmanie

Verwandte Themen