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.

7voto

Gass Punkte 3731

Ein Ansatz wäre die Verwendung von splice() um das Element aus dem Array zu entfernen, und dann mit der Option splice() Methode noch einmal, fügen Sie das entfernte Element in die Zielindex .

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

const newArray = moveItem(array, 3, 1) // move element from index 3 to index 1

function moveItem(arr, fromIndex, toIndex){
  let itemRemoved = arr.splice(fromIndex, 1) // assign the removed item as an array
  arr.splice(toIndex, 0, itemRemoved[0]) // insert itemRemoved into the target index
  return arr
}

console.log(newArray)

6voto

abr Punkte 161

Eine weitere reine JS-Variante mit ES6-Array-Spread-Operator ohne Mutation

const reorder = (array, sourceIndex, destinationIndex) => {
    const smallerIndex = Math.min(sourceIndex, destinationIndex);
    const largerIndex = Math.max(sourceIndex, destinationIndex);

    return [
        ...array.slice(0, smallerIndex),
        ...(sourceIndex < destinationIndex
            ? array.slice(smallerIndex + 1, largerIndex + 1)
            : []),
        array[sourceIndex],
        ...(sourceIndex > destinationIndex
            ? array.slice(smallerIndex, largerIndex)
            : []),
        ...array.slice(largerIndex + 1),
    ];
}

// returns ['a', 'c', 'd', 'e', 'b', 'f']
console.log(reorder(['a', 'b', 'c', 'd', 'e', 'f'], 1, 4))

6voto

Jared Updike Punkte 6917

Ein Ansatz wäre, ein neues Array mit den Teilen in der gewünschten Reihenfolge zu erstellen, indem man die Slice-Methode verwendet.

Beispiel

var arr = [ 'a', 'b', 'c', 'd', 'e'];
var arr2 = arr.slice(0,1).concat( ['d'] ).concat( arr.slice(2,4) ).concat( arr.slice(4) );
  • arr.slice(0,1) ergibt ['a']
  • arr.slice(2,4) ergibt ['b', 'c']
  • arr.slice(4) ergibt ['e']

5voto

Javid Jamae Punkte 8333

Ich brauchte eine unveränderliche Verschiebemethode (eine, die das ursprüngliche Array nicht veränderte), also passte ich @Reids akzeptierte Antwort an, um einfach Object.assign zu verwenden, um eine Kopie des Arrays zu erstellen, bevor ich den Splice durchführte.

Array.prototype.immutableMove = 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;
};

Hier ist ein jsfiddle zeigt es in Aktion .

5voto

Ken Franqueiro Punkte 10541

El splice Methode der Array könnte helfen: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/splice

Bedenken Sie jedoch, dass dies relativ teuer sein kann, da das Array aktiv neu indiziert werden muss.

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