2010-03-14 7 views
55

Di ', ho una matrice che assomiglia a questo:array Riordinamento

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 utilizzare giunzione, in questo modo:

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

Ma non funziona.

+3

Cosa significa "non funziona" media - ci si genera un errore, cosa cambia nulla, cosa cambia l'array in un modo che non intendeva? Mi sembra ragionevole. –

risposta

2

Change 2-1 come primo parametro nella chiamata giunzione quando si rimuove l'elemento:

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

dovrebbe essere playlist.splice (2,0, tmp [0]); Destra? – Crisboot

2

Si può sempre utilizzare il metodo di ordinamento, se non sai dove il record è attualmente:

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

Intelligente. Mi piace. – Gaelan

+0

Che dire di 'return + (a.artist ==" Lalo Schifrin ")' – Funkodebat

+1

@Funko puoi farlo, se preferisci la brevità rispetto alla verbosità. –

15

Se conoscete gli indici si potrebbe 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 di array sono solo proprietà dell'oggetto array, quindi è possibile scambiarne i valori.

137

La sintassi del Array.splice è:

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

Dove:

  • indice è la posizione nella matrice si desidera iniziare la rimozione di elementi da
  • howmany è quante elementi che si desidera rimuovere dall'indice
  • element1, ..., elementX sono elementi che si desidera inserire dalla posizione indice.

Ciò significa che è possibile utilizzare splice() per rimuovere elementi, aggiungere elementi o sostituire elementi in un array, a seconda degli argomenti passati.

Si noti che restituisce un array degli elementi rimossi.

qualcosa di bello e generica sarebbe:

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

poi basta usare:

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

Diagramma:

Algorithm diagram

+9

Questa è una buona risposta e la giuntura() all'interno di un giunto() svolge bene il lavoro. Va notato, tuttavia, che l'aggiunta di un metodo move() al prototipo Array è chiamata "Patching scimmia" ed è generalmente considerata una cattiva pratica. http://stackoverflow.com/questions/5741877/is-monkey-patching-really-that-bad –

1

Prova questo:

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

Se sempre e solo desidera spostare un elemento da una posizione arbitraria al fine dell'array, questo dovrebbe funzionare:

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

Se si desidera spostare più oggetti da qualche posizione arbitraria fino alla fine, si può fare:

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

Se si desidera spostare più oggetti da qualche posizione arbitraria in una certa posizione arbitraria, provare:

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

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

Ciao, potresti spiegarmi i vantaggi di questa funzione rispetto alla risposta sopra? – Xogno

+0

Questa soluzione non modifica l'elemento originale ma restituisce un nuovo array con la voce che viene spostata. – chmanie