[解決済み] 配列の要素をある配列位置から別の配列位置へ移動させる
質問
配列の要素を移動させる方法がわからなくて困っています。例えば、次のようなものがあるとします。
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)
.
関連
-
[解決済み】ある要素を別の要素に移動させるには?
-
[解決済み】未定義のプロパティ 'bind' を読み込めない。React.js【重複あり
-
[解決済み] [Solved] Uncaught TypeError: nullのプロパティ 'appendChild' を読み取ることができない。
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] 配列から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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】このエラーの原因は何ですか - "Fatal error: ローカルgruntを見つけることができません"
-
[解決済み】Failed to load resource: net::ERR_FILE_NOT_FOUND loading json.js
-
[解決済み】Uncaught TypeError: nullのプロパティ'value'を読み取ることができない
-
[解決済み】webpack-dev-serverにリモート接続すると、「Invalid Host header」というメッセージが表示されます。
-
[解決済み】BootstrapのCollapseが折りたたまれない
-
[解決済み】別のjsファイル内でJavaScriptの関数を呼び出す
-
[解決済み] エラー。モジュールhtmlが見つからない
-
[解決済み】DOMException: サポートされているソースが見つからなかったため、読み込みに失敗しました。
-
[解決済み】'useState' が定義されていない no-undef React
-
[解決済み] 汎用リスト - リスト内の項目を移動する