Wenn Sie eine Version auf npm möchten, array-move kommt dieser Antwort am nächsten, auch wenn es sich nicht um dieselbe Implementierung handelt. Siehe den Abschnitt über die Verwendung für weitere Details. Die vorherige Version dieser Antwort (die Array.prototype.move modifiziert hat) kann auf npm gefunden werden unter array.prototype.move .
Ich hatte recht guten Erfolg mit dieser Funktion:
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));
Beachten Sie, dass die letzte return
ist lediglich zu Testzwecken gedacht: splice
führt die Operationen auf dem Array an Ort und Stelle aus, so dass eine Rückgabe nicht erforderlich ist. Durch die Erweiterung, die move
ist eine In-Place-Operation. Wenn Sie das vermeiden und eine Kopie zurückgeben wollen, verwenden Sie slice
.
Schritt für Schritt durch den Code:
- Si
new_index
größer ist als die Länge des Arrays, wollen wir (so nehme ich an) das Array mit neuen undefined
s. Dieses kleine Snippet behandelt dies, indem es undefined
auf das Array, bis wir die richtige Länge haben.
- Dann, in
arr.splice(old_index, 1)[0]
spleißen wir das alte Element heraus. splice
gibt das Element zurück, das herausgespleißt wurde, aber es befindet sich in einem Array. In unserem obigen Beispiel war dies [1]
. Wir nehmen also den ersten Index dieses Arrays, um den Rohwert zu erhalten 1
dort.
- Dann verwenden wir
splice
um dieses Element an der Stelle von new_index einzufügen. Da wir das Array oben aufgefüllt haben, wenn new_index > arr.length
wird sie wahrscheinlich an der richtigen Stelle erscheinen, es sei denn, sie haben etwas Seltsames getan, wie zum Beispiel eine negative Zahl eingegeben.
Eine ausgefeiltere Version zur Berücksichtigung negativer Indizes:
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));
Dabei sollten Dinge berücksichtigt werden wie array_move([1, 2, 3], -1, -2)
richtig (das letzte Element an die vorletzte Stelle verschieben). Das Ergebnis sollte dann sein [1, 3, 2]
.
Wie auch immer, in Ihrer ursprünglichen Frage würden Sie Folgendes tun array_move(arr, 0, 2)
para a
nach c
. Para d
vor b
würden Sie tun array_move(arr, 3, 1)
.
0 Stimmen
ES6 verwenden
const changeValuePosition = (arr, init, target) => {[arr[init],arr[target]] = [arr[target],arr[init]]; return arr}
5 Stimmen
Das vertauscht einfach die Elemente bei
init
ytarget
.0 Stimmen
@user4945014 Es geht nicht nur um den Tausch. Wenn eine Vertauschung stattfindet, würde der OP array = ['a', 'd', 'c', 'b', 'e'] erhalten, was bedeuten würde, dass 'c' und 'b' in der falschen Reihenfolge wären. Ein Insert und Shift, wie er es sucht, hält 'b' und 'c' in der gleichen Reihenfolge.