配列の要素を移動する方法を理解するのに苦労しています。たとえば、次のようになります。
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
。
コードをステップ実行します:
new_index
が配列の長さより大きい場合、配列を新しい で適切に埋め込む必要があります (と推測します)undefined
。この小さなスニペットは、undefined
適切な長さになるまで配列をプッシュすることでこれを処理します。- 次に、 で
arr.splice(old_index, 1)[0]
、古い要素をつなぎ合わせます。はsplice
、つなぎ合わせた要素を返しますが、これは配列内にあります。上記の例では、これは でした[1]
。そこで、その配列の最初のインデックスを取得して、生の要素を取得します1
。 - 次に、
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に対しては を実行します。a
c
d
b
array_move(arr, 3, 1)