776 Stimmen

Verschieben eines Array-Elements von einer Array-Position zu einer anderen

Ich habe eine harte Zeit herauszufinden, wie man ein Element eines Arrays zu bewegen. Zum Beispiel, gegeben die folgenden:

var array = [ 'a', 'b', 'c', 'd', 'e'];

Wie kann ich eine Funktion schreiben, um das Element zu verschieben 'd' links von 'b' ?

O 'a' rechts von 'c' ?

Nach dem Verschieben der Elemente sollten die Indizes der übrigen Elemente aktualisiert werden. Die resultierende Anordnung wäre:

array = ['a', 'd', 'b', 'c', 'e']

Das scheint ziemlich einfach zu sein, aber ich kann es nicht begreifen.

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 y target .

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.

2voto

cagdas_ucar Punkte 117

Ich dachte, das sei ein Swap-Problem, aber das ist es nicht. Hier ist meine Ein-Zeilen-Lösung:

const move = (arr, from, to) => arr.map((item, i) => i === to ? arr[from] : (i >= Math.min(from, to) && i <= Math.max(from, to) ? arr[i + Math.sign(to - from)] : item));

Hier ist ein kleiner Test:

let test = ['a', 'b', 'c', 'd', 'e'];
console.log(move(test, 0, 2)); // [ 'b', 'c', 'a', 'd', 'e' ]
console.log(move(test, 1, 3)); // [ 'a', 'c', 'd', 'b', 'e' ]
console.log(move(test, 2, 4)); // [ 'a', 'b', 'd', 'e', 'c' ]
console.log(move(test, 2, 0)); // [ 'c', 'a', 'b', 'd', 'e' ]
console.log(move(test, 3, 1)); // [ 'a', 'd', 'b', 'c', 'e' ]
console.log(move(test, 4, 2)); // [ 'a', 'b', 'e', 'c', 'd' ]
console.log(move(test, 4, 0)); // [ 'e', 'a', 'b', 'c', 'd' ]

2voto

Andrew Punkte 7639

Am Ende habe ich zwei davon kombiniert, um bei kleinen und großen Entfernungen ein wenig besser arbeiten zu können. Ich erhalte ziemlich konsistente Ergebnisse, aber dies könnte wahrscheinlich ein wenig von jemandem klüger als ich gezwickt werden, um anders für verschiedene Größen usw. arbeiten.

Die Verwendung einiger der anderen Methoden war beim Verschieben von Objekten über kleine Entfernungen deutlich schneller (x10) als die Verwendung von Splice. Dies kann sich zwar je nach Länge des Arrays ändern, aber für große Arrays gilt es.

function ArrayMove(array, from, to) {
    if ( Math.abs(from - to) > 60) {
        array.splice(to, 0, array.splice(from, 1)[0]);
    } else {
        // works better when we are not moving things very far
        var target = array[from];
        var inc = (to - from) / Math.abs(to - from);
        var current = from;
        for (; current != to; current += inc) {
            array[current] = array[current + inc];
        }
        array[to] = target;    
    }
}

https://web.archive.org/web/20181026015711/https://jsperf.com/arraymove-many-sizes

2voto

Dudley Craig Punkte 151

Ich liebe unveränderliche, funktionale Einzeiler :) ...

const swapIndex = (array, from, to) => (
  from < to 
    ? [...array.slice(0, from), ...array.slice(from + 1, to + 1), array[from], ...array.slice(to + 1)] 
    : [...array.slice(0, to), array[from], ...array.slice(to, from), ...array.slice(from + 1)]
);

2voto

BernieSF Punkte 1502

Es wird an vielen Stellen erklärt ( Hinzufügen benutzerdefinierter Funktionen in Array.prototype ) spielen mit dem Array-Prototyp könnte eine schlechte Idee sein, jedenfalls habe ich das Beste aus verschiedenen Beiträgen kombiniert, kam ich mit diesem, mit modernen Javascript:

    Object.defineProperty(Array.prototype, 'immutableMove', {
        enumerable: false,
        value: function (old_index, new_index) {
            var copy = Object.assign([], this)
            if (new_index >= copy.length) {
                var k = new_index - copy.length;
                while ((k--) + 1) { copy.push(undefined); }
            }
            copy.splice(new_index, 0, copy.splice(old_index, 1)[0]);
            return copy
        }
    });

    //how to use it
    myArray=[0, 1, 2, 3, 4];
    myArray=myArray.immutableMove(2, 4);
    console.log(myArray);
    //result: 0, 1, 3, 4, 2

Hoffnung kann für jeden nützlich sein

2voto

Nour Adel Punkte 41

Dies ist eine sehr einfache Methode, bei der die Spleißung

Array.prototype.moveToStart = function(index) {
    this.splice(0, 0, this.splice(index, 1)[0]);
    return this;
  };

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X