[解決済み] 配列の要素をある配列位置から別の配列位置に移動する。
質問
配列の要素を移動させる方法がわからなくて困っています。例えば、次のようなものがあるとします。
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
.
コードを踏んでいく。
-
もし
new_index
が配列の長さよりも大きい場合は、(おそらく)新しいundefined
s. この小さなスニペットでは、この処理を行うためにundefined
を、適切な長さになるまで配列に追加します。 -
次に
arr.splice(old_index, 1)[0]
で、古い要素を切り離す。splice
はスプライスアウトされた要素を返しますが、それは配列になっています。上の例では、これは[1]
. そこで、その配列の最初のインデックスを取得して、生の1
そこに -
次に
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)
に対して
a
後
c
. の場合
d
以前
b
であれば
array_move(arr, 3, 1)
.
関連
-
[解決済み】JavaScriptでインラインIF文の書き方は?
-
[解決済み】 Uncaught TypeError : undefined のプロパティ 'replace' を読み取れない In Grid
-
[解決済み】ある要素を別の要素に移動させるには?
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] PHPで配列から要素を削除する
-
[解決済み] Javascriptで配列から空の要素を削除する
-
[解決済み] 新しい配列を作成せずに、既存のJavaScript配列を別の配列で拡張する方法
-
[解決済み] 配列の最初の要素を取得する
-
[解決済み] 配列の項目を別の配列にコピーする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
JSクロスドメインソリューション リアクト構成 リバースプロキシ
-
Vue Element-uiは、アイコンを追加するためのツリーコントロールノードを詳細に実装しています。
-
vue3.0プロジェクトのアーキテクチャを構築するための便利なツール
-
vueディレクティブv-bindの使用と注意点
-
vueのプロジェクトでモックを使用する方法を知っていますか?
-
[解決済み】Uncaught SyntaxError: JSONの位置0に予期しないトークンuがあります。
-
[解決済み】Node.jsで "Cannot find module "エラーを解決するには?
-
[解決済み】TypeError: Router.use() はミドルウェアの関数を要求しているが、Object を取得した。
-
モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory, scandir 'D:\.... \node_modules
-
[解決済み] 汎用リスト - リスト内の項目を移動する