Riordinare gli array

Di ‘, ho un array che assomiglia a questo:

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

Come posso spostare un elemento in un’altra posizione?

Voglio spostare, ad esempio, {artist:"Lalo Schifrin", title:"Shifting Gears"} fino alla fine.

Ho provato ad usare splice, in questo modo:

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

Ma non funziona.

La syntax di Array.splice è:

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

Dove:

  • index è la posizione nell’array da cui vuoi iniziare a rimuovere elementi
  • quanti sono gli elementi che si desidera rimuovere dall’indice
  • element1, …, elementX sono elementi che vuoi inserire dall’indice di posizione.

Ciò significa che splice() può essere usato per rimuovere elementi, aggiungere elementi o sostituire elementi in una matrice, a seconda degli argomenti che si passano.

Si noti che restituisce una matrice degli elementi rimossi.

Qualcosa di carino e generico sarebbe:

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

Quindi usa solo:

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

Diagramma:

Diagramma dell'algoritmo

Se conosci gli indici puoi facilmente scambiare gli elementi, con una semplice funzione come questa:

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

Gli indici array sono solo proprietà dell’object array, quindi è ansible scambiarne i valori.

Ecco una versione immutabile per coloro che sono interessati:

 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; }, []); } 

Cambia 2 a 1 come primo parametro nella chiamata di splicing quando si rimuove l’elemento:

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

Puoi sempre utilizzare il metodo di ordinamento, se non sai dove è attualmente il record:

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

Prova questo:

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

Se vuoi solo spostare un object da una posizione arbitraria alla fine dell’array, questo dovrebbe funzionare:

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

Se vuoi spostare più oggetti da una posizione arbitraria alla fine, puoi fare:

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

Se vuoi spostare più oggetti da una posizione arbitraria ad una posizione arbitraria, prova:

 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; } 

Riordinare il suo lavoro in questo modo

  var tmpOrder = playlist[oldIndex]; playlist.splice(oldIndex, 1); playlist.splice(newIndex, 0, tmpOrder); 

Spero che funzioni