たとえば、次のような配列があります。
var playlist = [
{artist:"Herbie Hancock", title:"Thrust"},
{artist:"Lalo Schifrin", title:"Shifting Gears"},
{artist:"Faze-O", title:"Riding High"}
];
要素を別の位置に移動するにはどうすればよいですか?
たとえば、{artist:"Lalo Schifrin", title:"Shifting Gears"}
最後まで。
次のようにスプライスを使用してみました:
var tmp = playlist.splice(2,1);
playlist.splice(2,0,tmp);
しかし、それは機能しません。
_Array.splice
_ の構文は次のとおりです。
_yourArray.splice(index, howmany, element1, /*.....,*/ elementX);
_
どこ:
これは、splice()
を使用して、渡す引数に応じて、要素の削除、要素の追加、または配列内の要素の置換を行うことができることを意味します。
削除された要素の配列を返すことに注意してください。
ナイスでジェネリックなものは次のとおりです。
_Array.prototype.move = function (from, to) {
this.splice(to, 0, this.splice(from, 1)[0]);
};
_
次に使用します:
_var ar = [1,2,3,4,5];
ar.move(0,3);
alert(ar) // 2,3,4,1,5
_
図:
インデックスがわかっている場合は、次のような単純な関数を使用して、要素を簡単に交換できます。
function swapElement(array, indexA, indexB) {
var tmp = array[indexA];
array[indexA] = array[indexB];
array[indexB] = tmp;
}
swapElement(playlist, 1, 2);
// [{"artist":"Herbie Hancock","title":"Thrust"},
// {"artist":"Faze-O","title":"Riding High"},
// {"artist":"Lalo Schifrin","title":"Shifting Gears"}]
配列インデックスは配列オブジェクトの単なるプロパティなので、その値を交換できます。
興味がある人のための不変のバージョンは次のとおりです。
function immutableMove(arr, from, to) {
return arr.reduce((prev, current, idx, self) => {
if (from === to) {
prev.Push(current);
}
if (idx === from) {
return prev;
}
if (from < to) {
prev.Push(current);
}
if (idx === to) {
prev.Push(self[from]);
}
if (from > to) {
prev.Push(current);
}
return prev;
}, []);
}
要素を削除するときに、スプライス呼び出しの最初のパラメーターとして2を1に変更します。
var tmp = playlist.splice(1, 1);
playlist.splice(2, 0, tmp[0]);
レコードが現在どこにあるかわからない場合は、常にsortメソッドを使用できます。
playlist.sort(function (a, b) {
return a.artist == "Lalo Schifrin"
? 1 // Move it down the list
: 0; // Keep it the same
});
1つのアイテムを任意の位置から配列の最後に移動するだけの場合、これは機能するはずです。
function toEnd(list, position) {
list.Push(list.splice(position, 1));
return list;
}
複数のアイテムを任意の位置から最後まで移動する場合は、次のことができます。
function toEnd(list, from, count) {
list.Push.apply(list, list.splice(from, count));
return list;
}
複数のアイテムを任意の位置から任意の位置に移動する場合は、次を試してください。
function move(list, from, count, to) {
var args = [from > to ? to : to - count, 0];
args.Push.apply(args, list.splice(from, count));
list.splice.apply(list, args);
return list;
}
ES6を使用すると、次のようなことができます。
const swapPositions = (array, a ,b) => {
[array[a], array[b]] = [array[b], array[a]]
}
let array = [1,2,3,4,5];
swapPositions(array,0,1);
/// => [2, 1, 3, 4, 5]
編集:チェックアウトしてください アンディの答え 彼の答えが最初に来たので、これは単に彼の拡張です
これは古い質問ですが、Array.prototype.sort()
を含めることは価値があると思います。
MDNからの例を示します リンクと一緒に
_var numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
return a - b;
});
console.log(numbers);
// [1, 2, 3, 4, 5]
_
幸いなことに、数字だけで機能するわけではありません:
arr.sort([compareFunction])
compareFunction
ソート順を定義する関数を指定します。省略すると、配列は各要素の文字列変換に従って、各文字のUnicodeコードポイント値に従ってソートされます。
名前で注文していることに気付きました:
_let playlist = [
{artist:"Herbie Hancock", title:"Thrust"},
{artist:"Lalo Schifrin", title:"Shifting Gears"},
{artist:"Faze-O", title:"Riding High"}
];
// sort by name
playlist.sort((a, b) => {
if(a.artist < b.artist) { return -1; }
if(a.artist > b.artist) { return 1; }
// else names must be equal
return 0;
});
_
姓で並べ替える場合は、_first_name
_と_last_name
_の両方のキーを持っているか、正規表現の魔法を実行する必要があることに注意してください。XDは実行できません
それが役立つことを願っています:)
これを試して:
playlist = playlist.concat(playlist.splice(1, 1));
この方法で作業を並べ替える
var tmpOrder = playlist[oldIndex];
playlist.splice(oldIndex, 1);
playlist.splice(newIndex, 0, tmpOrder);
これがうまくいくことを願っています
単純な可変ソリューションとして、スプライスを連続して2回呼び出すことができます。
playlist.splice(playlist.length - 1, 1, ...playlist.splice(INDEX_TO_MOVE, 1))
一方、このメソッドは元の配列のセクションのコピーを変更せずに返すため、単純な不変のソリューションではスライスを使用できます。
const copy = [...playlist.slice(0, INDEX_TO_MOVE - 1), ...playlist.slice(INDEX_TO_MOVE), ...playlist.slice(INDEX_TO_MOVE - 1, INDEX_TO_MOVE)]