Si vous souhaitez une version sur npm, array-move est ce qui se rapproche le plus de cette réponse, bien qu'il ne s'agisse pas de la même implémentation. Voir sa section utilisation pour plus de détails. La version précédente de cette réponse (qui modifiait Array.prototype.move) peut être trouvée sur npm à l'adresse suivante array.prototype.move .
J'ai eu un assez bon succès avec cette fonction :
function array_move(arr, old_index, new_index) {
if (new_index >= arr.length) {
var k = new_index - arr.length + 1;
while (k--) {
arr.push(undefined);
}
}
arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);
return arr; // for testing
};
// returns [2, 1, 3]
console.log(array_move([1, 2, 3], 0, 1));
Notez que le dernier return
est simplement à des fins de test : splice
effectue les opérations sur le tableau en place, donc un retour n'est pas nécessaire. Par extension, cette move
est une opération "in-place". Si vous voulez éviter cela et retourner une copie, utilisez slice
.
Passer à travers le code :
- Si
new_index
est supérieure à la longueur du tableau, nous voulons (je suppose) remplir correctement le tableau avec de nouvelles données de type undefined
s. Ce petit bout de code gère cela en poussant undefined
sur le tableau jusqu'à ce que nous ayons la bonne longueur.
- Ensuite, en
arr.splice(old_index, 1)[0]
on retire l'ancien élément. splice
renvoie l'élément qui a été découpé, mais c'est dans un tableau. Dans notre exemple ci-dessus, c'était [1]
. Donc, nous prenons le premier indice de ce tableau pour obtenir l'indice brut. 1
là.
- Ensuite, nous utilisons
splice
pour insérer cet élément à la place du new_index. Puisque nous avons rempli le tableau ci-dessus si new_index > arr.length
il apparaîtra probablement au bon endroit, à moins qu'ils n'aient fait quelque chose d'étrange comme entrer un nombre négatif.
Une version plus sophistiquée pour tenir compte des indices négatifs :
function array_move(arr, old_index, new_index) {
while (old_index < 0) {
old_index += arr.length;
}
while (new_index < 0) {
new_index += arr.length;
}
if (new_index >= arr.length) {
var k = new_index - arr.length + 1;
while (k--) {
arr.push(undefined);
}
}
arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);
return arr; // for testing purposes
};
// returns [1, 3, 2]
console.log(array_move([1, 2, 3], -1, -2));
Ce qui devrait tenir compte de choses comme array_move([1, 2, 3], -1, -2)
correctement (déplacer le dernier élément à l'avant-dernière place). Le résultat devrait être [1, 3, 2]
.
Quoi qu'il en soit, dans votre question originale, vous feriez array_move(arr, 0, 2)
para a
après c
. Pour d
avant b
vous feriez array_move(arr, 3, 1)
.
0 votes
En utilisant ES6
const changeValuePosition = (arr, init, target) => {[arr[init],arr[target]] = [arr[target],arr[init]]; return arr}
2 votes
Il suffit de permuter les éléments à
init
ytarget
.