copyWithin【内部コピー】
fill【指定値設定】
reverse【要素反転】
sort【ソート】
Array.prototype.copyWithin【内部コピー】
メモ
- 配列内の要素をコピー(上書き)し配列を変更
- ~Array【型指定配列ビュー (%TypedArray%)】オブジェクト の copyWithin【内部コピー】も同じアルゴリズム
- コピーはシャローコピー (コピー元のオブジェクトは新規生成されずに同じ参照)
- コピー元とコピー先に重なりがあっても正しくコピー (内部でコピー順を調整)
- 配列の範囲を超えてのコピーは行わない
- コピーの方向が逆の場合、処理なし (コピー元の終了位置 < コピー元の開始位置)
- 外部リンク (英語)
Array.prototype.copyWithin (target, start [ , end ] ) ES2022 (13) ES2021 (12) ES2020 (11)
構文
array.copyWithin( target, start[, end] )
array.copyWithin( target[, start[, end]] )
変更後の元の配列 (配列変更)
target コピー先の要素インデックス (詳細は下記参照)
start コピー元の開始要素インデックス (詳細は下記参照)
end コピー元の終了要素インデックス (この位置は含まない:詳細は下記参照)
target | 説明 |
---|---|
範囲外 | 補正 |
0 ≦ target | 先頭からの要素インデックス |
target < 0 (-1:末尾) | 末尾からの要素インデックス (要素数 - target) |
start | 説明 |
---|---|
範囲外 | 補正 |
0 ≦ start | 先頭からの要素インデックス |
start < 0 (-1:末尾) | 末尾からの要素インデックス (要素数 - start) |
end | 説明 |
---|---|
省略 | 要素数 |
範囲外 | 補正 |
0 ≦ end | 先頭からの要素インデックス |
end < 0 (-1:末尾) | 末尾からの要素インデックス (要素数 - end) |
例
var array = [ 0, 1, 2, 3, 4, 5, 6, 7 ];
var arrayNew = array.copyWithin(5, 1, 3);
console.log(arrayNew); // 出力:[0, 1, 2, 3, 4, 1, 2, 7]
console.log(array); // 出力:[0, 1, 2, 3, 4, 1, 2, 7] 元の配列を変更
array = [ -8, -7, -6, -5, -4, -3, -2, -1 ];
array.copyWithin(-8, -3);
console.log(array); // 出力:[-3, -2, -1, -5, -4, -3, -2, -1]
// シャローコピー
var arrayInner = [ 10, 20 ];
array = [ 0, arrayInner, 2 ];
array.copyWithin(2, 1);
console.log(array); // 出力:[0, Array[2], Array[2]]
console.log(array[1]); // 出力:[10, 20]
console.log(array[2]); // 出力:[10, 20]
array[1][0] = 100;
console.log(array[1]); // 出力:[100, 20]
console.log(array[2]); // 出力:[100, 20] 参照のため変更
// 【~Array【型指定配列ビュー (%TypedArray%)】オブジェクト】
var array = [ 0, 1, 2, 3, 4, 5 ];
var typedArray = new Int32Array(array);
typedArray.copyWithin(3, 1, 4);
console.log(typedArray); // 出力:[0, 1, 2, 1, 2, 3]
// 【コピー範囲の重なり】
var array1 = [ 0, 1, 2, 3, 4, 5, 6, 7 ];
array1.copyWithin(0, 2, 6);
console.log(array1); // 出力:[2, 3, 4, 5, 4, 5, 6, 7]
var array2 = [ 0, 1, 2, 3, 4, 5, 6, 7 ];
array2.copyWithin(4, 2, 6);
console.log(array2); // 出力:[0, 1, 2, 3, 2, 3, 4, 5]
// 【配列の範囲を超えてのコピーなし】
var array = [ 0, 1, 2, 3, 4, 5, 6, 7 ];
array.copyWithin(5, 0, 7);
console.log(array); // 出力:[0, 1, 2, 3, 4, 0, 1, 2]
// 【逆方向】
array = [ 0, 1, 2, 3, 4, 5, 6, 7 ];
array.copyWithin(5, 3, 1); // 処理なし
console.log(array); // 出力:[0, 1, 2, 3, 4, 5, 6, 7]
Array.prototype.fill【指定値設定】
メモ
- 配列内の要素範囲を指定値で設定し配列を変更
- ~Array【型指定配列ビュー (%TypedArray%)】オブジェクト の fill【指定値設定】も同じアルゴリズム
- 設定の方向が逆の場合、処理なし (コピー元の終了位置 < コピー元の開始位置)
- 外部リンク (英語)
Array.prototype.fill (value [ , start [ , end ] ] ) ES2022 (13) ES2021 (12) ES2020 (11)
構文
array.fill( value[, start[, end]] )
設定後の元の配列 (配列変更)
value 設定値
start 設定開始要素インデックス (詳細は下記参照)
end 設定終了要素インデックス (この位置は含まない:詳細は下記参照)
start | 説明 |
---|---|
範囲外 | 補正 |
0 ≦ start | 先頭からの要素インデックス |
start < 0 (-1:末尾) | 末尾からの要素インデックス (要素数 - start) |
end | 説明 |
---|---|
省略 | 要素数 |
範囲外 | 補正 |
0 ≦ end | 先頭からの要素インデックス |
end < 0 (-1:末尾) | 末尾からの要素インデックス (要素数 - end) |
例
var array = [ 0, 1, 2, 3, 4, 5, 6, 7 ];
var arrayNew = array.fill(-1, 1, 3);
console.log(arrayNew); // 出力:[0, -1, -1, 3, 4, 5, 6, 7]
console.log(array); // 出力:[0, -1, -1, 3, 4, 5, 6, 7] 元の配列を変更
array = [ -8, -7, -6, -5, -4, -3, -2, -1 ];
array.fill(0, -3);
console.log(array); // 出力:[-8, -7, -6, -5, -4, 0, 0, 0]
// 【~Array【型指定配列ビュー (%TypedArray%)】オブジェクト】
var array = [ 0, 1, 2, 3, 4, 5 ];
var typedArray = new Int32Array(array);
typedArray.fill(-1, 1, 4);
console.log(typedArray); // 出力:[0, -1, -1, -1, 4, 5]
// 【逆方向】
array = [ 0, 1, 2, 3, 4, 5, 6, 7 ];
array.fill(-1, 3, 1); // 処理なし
console.log(array); // 出力:[0, 1, 2, 3, 4, 5, 6, 7]
Array.prototype.reverse【要素反転】
メモ
- 配列要素を反転 (配列自体を反転)
- 外部リンク (英語)
Array.prototype.reverse ( ) ES2022 (13) ES2021 (12) ES2020 (11)
構文
array.reverse()
要素を反転した元の配列 (配列変更)
例
var array = [1, 2, 3];
array.reverse();
console.log(array); // 出力:[3, 2, 1]
array = [];
array.reverse();
console.log(array); // 出力:[]
Array.prototype.sort【ソート】
メモ
- 配列要素のソート
- 配列自体をソート
- 比較用コールバック関数の指定可
- 比較で等しい要素の順序は元のまま
- 外部リンク (英語)
Array.prototype.sort (comparefn) ES2022 (13) ES2021 (12) ES2020 (11)
構文
array.sort( [comparefn] )
要素をソートした元の配列 (配列変更)
comparefn 比較用コールバック関数 (詳細は下記参照)
省略:文字列変換して比較 (実装依存)
例外 TypeError 例外
comparefn が呼び出し可能な関数オブジェクト以外 (実装依存)
コールバック関数 引数名 (例) | 説明 |
---|---|
x | 要素x (実装依存) |
y | 要素y (実装依存) |
戻り値 (比較結果) | 説明 |
負 | x < y とみなす |
0 | x = y とみなす |
正 | y < x とみなす |
例
// 数値比較
function func(x, y) {
const ret = x - y;
console.log("x:" + x, "y:" + y, "戻り値:" + ret);
return ret;
}
let array = [2, 3, 1, 2, 123];
array.sort(func); // 実装によってはx・y逆転 (ソート結果は同じ)
// 出力:x:2 y:3 戻り値:-1
// 出力:x:3 y:1 戻り値:2
// 出力:x:2 y:1 戻り値:1
// 出力:x:3 y:2 戻り値:1
// 出力:x:2 y:2 戻り値:0
// 出力:x:3 y:123 戻り値:-120
console.log(array);
// 出力:Array(5) [1, 2, 2, 3, 123]
array = [2, 3, 1, 2, 123];
array.sort();
console.log(array);
// 出力:Array(5) [1, 123, 2, 2, 3] (実装依存)
array = [];
array.sort(func);
console.log(array);
// 出力:Array() []
array = [2, 3, 1, 2, 123];
array.sort(null); // TypeError 例外 (実装依存)