配列要素をある配列位置から別の配列位置に移動する 質問する

配列要素をある配列位置から別の配列位置に移動する 質問する

配列の要素を移動する方法を理解するのに苦労しています。たとえば、次のようになります。

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

'd'要素を の左側に移動する関数をどのように記述すればよいでしょうか'b'?

それとも'a'の右側ですか'c'?

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

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

これはかなり単純なことのように思えますが、私には理解できません。

ベストアンサー1

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。この小さなスニペットは、undefined適切な長さになるまで配列をプッシュすることでこれを処理します。
  2. 次に、 でarr.splice(old_index, 1)[0]、古い要素をつなぎ合わせます。はsplice、つなぎ合わせた要素を返しますが、これは配列内にあります。上記の例では、これは でした[1]。そこで、その配列の最初のインデックスを取得して、生の要素を取得します1
  3. 次に、spliceこの要素を new_index の場所に挿入するために を使用します。 上の if で配列にパディングを施したので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]

いずれにしても、元の質問では、afterarray_move(arr, 0, 2)に対してを実行します。beforeに対しては を実行します。acdbarray_move(arr, 3, 1)

おすすめ記事