1. ホーム
  2. javascript

[解決済み] 配列の要素をある配列位置から別の配列位置へ移動させる

2022-02-19 20:20:25

質問

配列の要素を移動させる方法がわからなくて困っています。例えば、次のようなものがあるとします。

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

要素を移動させる関数はどのように書けばよいのでしょうか? 'd' の左側にある 'b' ?

または 'a' の右側にある 'c' ?

要素を移動した後、残りの要素のインデックスを更新する必要があります。その結果、配列は次のようになります。

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

これはとても簡単なことのように思えますが、私の頭では理解することができません。

どのように解決するのですか?

npmでのバージョンを希望する場合。 配列移動 は、同じ実装ではありませんが、この答えに最も近いものです。詳しくは使い方のセクションをご覧ください。この回答の前のバージョン(Array.prototype.moveを修正したもの)は、npmの以下の場所で見つけることができます。 配列.プロトタイプ.移動 .


私はこの機能でかなり良い結果を得ました。

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)); 

なお、最後の return は単にテスト用です。 splice は配列に対してインプレースで操作を行うので、返り値は必要ありません。その延長線上で、この move はインプレース操作です。それを避けてコピーを返したい場合は slice .

コードを踏んでいく。

  1. もし new_index が配列の長さよりも大きい場合は、(おそらく)新しい undefined s. この小さなスニペットでは、この処理を行うために undefined を、適切な長さになるまで配列に追加します。
  2. 次に arr.splice(old_index, 1)[0] で、古い要素を切り離す。 splice はスプライスアウトされた要素を返しますが、それは配列になっています。上の例では、これは [1] . そこで、その配列の最初のインデックスを取得して、生の 1 そこに
  3. 次に splice を使って、new_indexの場所にこの要素を挿入しています。上の配列のパディングは new_index > arr.length のように、負の数を渡すような奇妙なことをしない限り、おそらく正しい位置に表示されるでしょう。

負のインデックスを考慮した、よりファンシーなバージョンです。

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));

のようなものを考慮する必要があります。 array_move([1, 2, 3], -1, -2) を適切に設定する(最後の要素を最後から2番目に移動させる)。その結果は次のようになるはずです。 [1, 3, 2] .

いずれにせよ、最初の質問では、次のようになります。 array_move(arr, 0, 2) に対して ac . の場合 d 以前 b であれば array_move(arr, 3, 1) .