紆余曲折を経てこの形に落ち着きそう。
(追記)delete演算子を使うのはよろしくなかったかな?
#引数解説
変数 | 型 | 説明 | |
---|---|---|---|
1 | arr | Array | 処理対象の配列 |
2 | idx | Number | 移動する要素のINDEX |
3 | mIdx | Number | 移動先のINDEX |
4 | after | Boolean | true : mIdxの後方に挿入 false / 省略 : 前方に挿入 |
#コード
const moveElement = (arr, idx, mIdx, after=false) => {
//事前処理は省略
arr = [...arr];
if (after) mIdx++;
const elm = arr[idx];
delete arr[idx];
arr.splice(mIdx, 0, elm);
return Object.values(arr);
};
//連番生成
const array = [...Array(10).keys()];
moveElement(array, 2, 8, true); // [0, 1, 3, 4, 5, 6, 7, 8, 2, 9]
moveElement(array, 8, 2); // [0, 1, 8, 2, 3, 4, 5, 6, 7, 9]
#やっている事(追記)
- 移動する要素を取得
- 取得した要素の位置を
delete
でempty状態にする - 配列の長さは変わらないので指定INDEXの前後へ
splice
で挿入 -
Object.values()
でempty状態の要素はスルーして配列を再構成
falsyな要素が消えても構わない場合は、delete
する代わりに空文字
を代入。
Object.values()
ではなくfilter(Boolean)
でreturnするのもありでしょう。