copyWithin【内部コピー】
with【コピー&要素変更 (配列変更なし)】
set【要素設定】
fill【指定値設定】
reverse【要素反転 (配列変更あり)】
toReversed【要素反転 (配列変更なし)】
sort【ソート (配列変更あり)】
toSorted【ソート (配列変更なし)】
%TypedArray%.prototype.copyWithin【内部コピー】
メモ
概要
- 配列内の要素をコピー(上書き)し配列を変更
- コピー元とコピー先に重なりがあっても正しくコピー (内部でコピー順を調整)
- 配列の範囲を超えてのコピーは行わない
- コピーの方向が逆の場合、処理なし (コピー元の終了位置 < コピー元の開始位置)
関連
外部リンク
- ECMA-262 (英語)
%TypedArray%.prototype.copyWithin ( target, start [ , end ] ) ES2024 (15) ES2023 (14) ES2022 (13)
構文
typedArray.copyWithin( target, start[, end] )
変更後の元の配列 (配列変更)
targetコピー先の位置インデックス (詳細は下記参照)
startコピー元の開始位置インデックス (詳細は下記参照)
endコピー元の終了位置インデックス (この位置は含まない:詳細は下記参照)
target | 備考 |
---|---|
範囲外 | 範囲内に補正 |
0 ≦ target | 先頭からの位置インデックス |
target < 0 | 末尾からの位置インデックス (要素数 + target) (-1:末尾) |
start | 備考 |
---|---|
範囲外 | 範囲内に補正 |
0 ≦ start | 先頭からの位置インデックス |
start < 0 | 末尾からの位置インデックス (要素数 + start) (-1:末尾) |
end | 備考 |
---|---|
省略 | 要素数 |
範囲外 | 範囲内に補正 |
0 ≦ end | 先頭からの位置インデックス |
end < 0 | 末尾からの位置インデックス (要素数 + end) (-1:末尾) |
例
let num_A = [ 0, 1, 2, 3, 4, 5, 6, 7 ];
let num_A_copyWithin = num_A.copyWithin(5, 1, 3);
console.log(num_A);
// 出力:[0, 1, 2, 3, 4, 1, 2, 7]
console.log(num_A_copyWithin);
// 出力:[0, 1, 2, 3, 4, 1, 2, 7]
let num_B = [ -8, -7, -6, -5, -4, -3, -2, -1 ];
let num_B_copyWithin = num_B.copyWithin(-8, -3);
console.log(num_B);
// 出力:[-3, -2, -1, -5, -4, -3, -2, -1]
console.log(num_B_copyWithin);
// 出力:[-3, -2, -1, -5, -4, -3, -2, -1]
// シャローコピー
let num_C_Inner = [ 10, 20 ];
let num_C = [ 0, 1, num_C_Inner, 3, 4 ];
console.log(num_C);
// 出力:(5) [0, 1, Array(2), 3, 4]
console.log(num_C[2]);
// 出力:(2) [10, 20]
num_C.copyWithin(3, 2);
console.log(num_C);
// 出力:(5) [0, 1, Array(2), Array(2), 3]
console.log(num_C[2]);
// 出力:[10, 20]
console.log(num_C[3]);
// 出力:[10, 20]
num_C[2][0] = 100;
console.log(num_C);
// 出力:
// (5) [0, 1, Array(2), Array(2), 3]
// 0: 0
// 1: 1
// 2: (2) [100, 20]
// 3: (2) [100, 20]
// 4: 3
// length: 5
// 【~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]
%TypedArray%.prototype.with【コピー&要素変更 (配列変更なし)】
メモ
概要
- 配列の1要素を変更しコピー
- 元の配列は変更なし
関連
外部リンク
- ECMA-262 (英語)
%TypedArray%.prototype.with ( index, value ) ES2024 (15) ES2023 (14) ES2022 (13)
構文
typedArray.with( index, value )
(%TypedArray%)コピーされた型指定配列ビュー
index設定位置インデックス (詳細は下記参照)
value設定値
RangeError
index (設定インデックス)が範囲外
index | 備考 |
---|---|
0 ≦index | 先頭からの要素位置 |
index< 0 | 末尾からの要素位置 (要素数 + index) (-1:末尾) |
例
const array_A = [0, 1, 2, 3, 4];
const num_A = new Int32Array(array_A);
const with_A = num_A.with(2, 99);
console.log( with_A ); // 出力:Int32Array(5) [0, 1, 99, 3, 4, (省略)]
console.log( num_A ); // 出力:Int32Array(5) [0, 1, 2, 3, 4, (省略)]
const array_B = [-5, -4, -3, -2, -1];
const num_B = new Int32Array(array_B);
const with_B = num_B.with(-4, 99);
console.log( with_B ); // 出力:Int32Array(5) [-5, 99, -3, -2, -1, (省略)]
console.log( num_B ); // 出力:Int32Array(5) [-5, -4, -3, -2, -1, (省略)]
// 範囲外 (後)
const num_X = new Int32Array(array_A);
try {
const with_X = num_X.with(10, 99);
} catch(e) {
console.log(e); // 例外:RangeError: Invalid typed array index
}
// 範囲外 (前)
const num_Y = new Int32Array(array_B);
try {
const with_Y = num_Y.with(-10, 99);
} catch(e) {
console.log(e); // 例外:RangeError: Invalid typed array index
}
%TypedArray%.prototype.set【要素設定】
メモ
概要
- 配列内の要素を指定配列で設定し配列を変更
関連
外部リンク
- ECMA-262 (英語)
%TypedArray%.prototype.set ( source [ , offset ] ) ES2024 (15) ES2023 (14) ES2022 (13)
構文
typedArray.set( source[, offset] )
なし
source (Array | %TypedArray%)設定配列
offset設定開始位置インデックス (0~:末尾からの指定不可 / 省略:0)
RangeError
offset<0
元の範囲を超えた設定 (offset+sourceの要素数>要素数)
例
const array = [0, 1, 2, 3, 4];
// Array
let typedArray = new Int32Array(array);
console.log(typedArray);
// 出力:Int32Array(5) [0, 1, 2, 3, 4, (省略) ]
typedArray.set([100, 101]);
console.log(typedArray);
// 出力:Int32Array(5) [100, 101, 2, 3, 4, (省略) ]
typedArray.set([203, 204], 3);
console.log(typedArray);
// 出力:Int32Array(5) [100, 101, 2, 203, 204, (省略) ]
// %TypedArray%
typedArray = new Int32Array(array);
console.log(typedArray);
// 出力:Int32Array(5) [0, 1, 2, 3, 4, (省略) ]
const typedArray_B = new Int32Array([900, 901]);
console.log(typedArray_B);
// 出力:Int32Array(2) [900, 901, (省略) ]
typedArray.set(typedArray_B);
console.log(typedArray);
// 出力:Int32Array(5) [900, 901, 2, 3, 4, (省略) ]
const typedArray_C = new Int32Array([903, 904]);
console.log(typedArray_C);
// 出力:Int32Array(2) [903, 904, (省略) ]
typedArray.set(typedArray_C, 3);
console.log(typedArray);
// 出力:Int32Array(5) [900, 901, 2, 903, 904, (省略) ]
// 例外
try {
typedArray.set([100, 101], -1);
} catch(e) {
console.log(e); // 例外:RangeError: offset is out of bounds
}
try {
typedArray.set([104, 105], 4);
} catch(e) {
console.log(e); // 例外:RangeError: offset is out of bounds
}
%TypedArray%.prototype.fill【指定値設定】
メモ
概要
- 配列内の要素範囲を指定値で設定し配列を変更
関連
外部リンク
- ECMA-262 (英語)
%TypedArray%.prototype.fill (value [ , start [ , end ] ] ) ES2024 (15) ES2023 (14) ES2022 (13)
構文
typedArray.fill( value[, start[, end]] )
設定後の元配列 (配列変更)
value設定値
start設定開始位置インデックス (詳細は下記参照)
end設定終了位置インデックス (この位置は含まない:詳細は下記参照)
※ start>end:処理なし
start | 備考 |
---|---|
省略 | 0 |
範囲外 | 範囲内に補正 |
0 ≦ start | 先頭からの位置インデックス |
start < 0 | 末尾からの位置インデックス (要素数 + start) (-1:末尾) |
end | 備考 |
---|---|
省略 | 要素数 |
範囲外 | 範囲内に補正 |
0 ≦ end | 先頭からの位置インデックス |
end < 0 | 末尾からの位置インデックス (要素数 + end) (-1:末尾) |
例
const num_plus = [ 0, 1, 2, 3, 4 ];
const num_minus = [ -5, -4, -3, -2, -1 ];
// start:省略・end:省略
const array_A = new Int32Array(num_plus);
const fill_A = array_A.fill(99);
console.log( fill_A ); // 出力:Int32Array(5) [99, 99, 99, 99, 99, (省略) ]
console.log( array_A ); // 出力:Int32Array(5) [99, 99, 99, 99, 99, (省略) ]
// end:省略
const array_B = new Int32Array(num_plus);
const fill_B = array_B.fill(99, 2);
console.log( fill_B ); // 出力:Int32Array(5) [0, 1, 99, 99, 99, (省略) ]
console.log( array_B ); // 出力:Int32Array(5) [0, 1, 99, 99, 99, (省略) ]
// 省略なし
const array_C = new Int32Array(num_plus);
const fill_C = array_C.fill(99, 1, 4);
console.log( fill_C ); // 出力:Int32Array(5) [0, 99, 99, 99, 4, (省略) ]
console.log( array_C ); // 出力:Int32Array(5) [0, 99, 99, 99, 4, (省略) ]
// start > end
const array_D = new Int32Array(num_plus);
const fill_D = array_D.fill(99, 4, 2);
console.log( fill_D ); // 出力:Int32Array(5) [0, 1, 2, 3, 4, (省略) ]
console.log( array_D ); // 出力:Int32Array(5) [0, 1, 2, 3, 4, (省略) ]
// start:負数 end:省略
const array_X = new Int32Array(num_minus);
const fill_X = array_X.fill(99, -2);
console.log( fill_X ); // 出力:Int32Array(5) [-5, -4, -3, 99, 99, (省略) ]
console.log( array_X ); // 出力:Int32Array(5) [-5, -4, -3, 99, 99, (省略) ]
// start:負数 end:負数
const array_Y = new Int32Array(num_minus);
const fill_Y = array_Y.fill(99, -4, -2);
console.log( fill_Y ); // 出力:Int32Array(5) [-5, 99, 99, -2, -1, (省略) ]
console.log( array_Y ); // 出力:Int32Array(5) [-5, 99, 99, -2, -1, (省略) ]
// start:範囲外 end:範囲外
const array_Z = new Int32Array(num_minus);
const fill_Z = array_Z.fill(99, -10, 10);
console.log( fill_Z ); // 出力:Int32Array(5) [99, 99, 99, 99, 99, (省略) ]
console.log( array_Z ); // 出力:Int32Array(5) [99, 99, 99, 99, 99, (省略) ]
%TypedArray%.prototype.reverse【要素反転 (配列変更あり)】
%TypedArray%.prototype.toReversed【要素反転 (配列変更なし)】
メモ
概要
- 配列要素を反転
メソッド 備考 reverse【要素反転 (配列変更あり)】 元配列の変更あり toReversed【要素反転 (配列変更なし)】 元配列の変更なし
関連
外部リンク
- ECMA-262 (英語)
%TypedArray%.prototype.reverse ( ) ES2024 (15) ES2023 (14) ES2022 (13) %TypedArray%.prototype.toReversed ( ) ES2024 (15) ES2023 (14) ES2022 (13)
構文
typedArray.reverse( )
typedArray.toReversed( )
要素反転後の配列
sort:元配列の参照 (元配列変更あり)
toSorted:新規配列 (元配列変更なし)
※ 空配列の要素反転は、空配列
例
const array = [1, 2, 3];
// reverse【要素反転 (配列変更あり)】
const num_A = new Int32Array(array);
const rev_A = num_A.reverse();
console.log( rev_A ); // 出力:Int32Array(3) [3, 2, 1, (省略) ]
console.log( num_A ); // 出力:Int32Array(3) [3, 2, 1, (省略) ]
// reverse【要素反転 (配列変更あり)】空配列
const empty_B = new Int32Array([]);
const rev_B = empty_B.reverse();
console.log( rev_B.length ); // 出力:0
// toReversed【要素反転 (配列変更なし)】
const num_X = new Int32Array(array);
const rev_X = num_X.toReversed();
console.log( rev_X ); // 出力:Int32Array(3) [3, 2, 1, (省略) ]
console.log( num_X ); // 出力:Int32Array(3) [1, 2, 3, (省略) ]
// toReversed【要素反転 (配列変更なし)】空配列
const empty_Y = new Int32Array([]);
const rev_Y = empty_Y.toReversed();
console.log( rev_Y.length ); // 出力:0
%TypedArray%.prototype.sort【ソート (配列変更あり)】
%TypedArray%.prototype.toSorted【ソート (配列変更なし)】
メモ
概要
- 配列要素のソート
- 比較用コールバック関数の指定可
- 比較で等しい要素の順序は元のまま
メソッド 備考 sort【ソート (配列変更あり)】 元配列の変更あり toSorted【ソート (配列変更なし)】 元配列の変更なし
関連
外部リンク
- ECMA-262 (英語)
%TypedArray%.prototype.sort (comparefn) ES2024 (15) ES2023 (14) ES2022 (13) %TypedArray%.prototype.toSorted ( comparefn ) ES2024 (15) ES2023 (14) ES2022 (13)
構文
typedArray.sort( [comparefn] )
typedArray.toSorted( [comparefn] )
ソート後の配列
sort:元配列の参照 (元配列変更あり)
toSorted:新規配列 (元配列変更なし)
comparefn比較用コールバック関数 (詳細は下記参照)
省略:数値比較
TypeError
comparefn が呼び出し可能な関数オブジェクト以外
コールバック関数 引数名 (例) | 備考 |
---|---|
x | 要素x |
y | 要素y |
戻り値 (比較結果) | 備考 |
負 | x < y とみなす |
0 | x = y とみなす |
正 | y < x とみなす |
例
// ソート関数 (絶対値で比較)
function func(x, y) {
const ret = Math.abs(x) - Math.abs(y);
console.log("x:" + x, "y:" + y, "戻り値:" + ret);
return ret;
}
const array = [2, 3, -10, 1, 2, 123];
const typedArraySort_A = new Int32Array(array);
const typedArraySort_B = new Int32Array(array);
const typedArraySort_C = new Int32Array(array);
const typedArrayToSorted_A = new Int32Array(array);
const typedArrayToSorted_B = new Int32Array(array);
const typedArrayToSorted_C = new Int32Array(array);
// sort【ソート (配列変更あり)】
let typedArraySort = typedArraySort_A.sort();
console.log(typedArraySort);
// 出力:Int32Array(5) [-10, 1, 2, 2, 3, 123, (省略) ]
console.log(typedArraySort_A);
// 出力:Int32Array(5) [-10, 1, 2, 2, 3, 123, (省略) ]
// sort【ソート (配列変更あり)】関数指定
// 実装によってはx・y逆転 (ソート結果は同じ)
typedArraySort = typedArraySort_B.sort(func);
// 出力:
// x:3 y:-10 戻り値:-7
// x:2 y:3 戻り値:-1
// x:2 y:123 戻り値:-121
// x:1 y:2 戻り値:-1
// x:2 y:1 戻り値:1
// x:2 y:2 戻り値:0
// x:3 y:2 戻り値:1
// x:3 y:123 戻り値:-120
// x:-10 y:123 戻り値:-113
console.log(typedArraySort);
// 出力:Int32Array(6) [1, 2, 2, 3, -10, 123, (省略) ]
console.log(typedArraySort_B);
// 出力:Int32Array(6) [1, 2, 2, 3, -10, 123, (省略) ]
// sort【ソート (配列変更あり)】空配列
const typedArraySort_Empty = new Int32Array([]);
typedArraySort = typedArraySort_Empty.sort();
console.log(typedArraySort.length);
// 出力:0
// sort【ソート (配列変更あり)】関数不正
try {
typedArraySort = typedArraySort_C.sort(null);
} catch(e) {
console.log(e);
// 出力:TypeError: The comparison function must be either a function or undefined
}
// toSorted【ソート (配列変更なし)】
let typedArrayToSorted = typedArrayToSorted_A.toSorted();
console.log(typedArrayToSorted);
// 出力:Int32Array(6) [-10, 1, 2, 2, 3, 123, (省略) ]
console.log(typedArrayToSorted_A);
// 出力:Int32Array(6) [2, 3, -10, 1, 2, 123, (省略) ]
// toSorted【ソート (配列変更なし)】関数指定
// 実装によってはx・y逆転 (ソート結果は同じ)
typedArrayToSorted = typedArrayToSorted_B.toSorted(func);
// 出力:
// x:3 y:-10 戻り値:-7
// x:2 y:3 戻り値:-1
// x:2 y:123 戻り値:-121
// x:1 y:2 戻り値:-1
// x:2 y:1 戻り値:1
// x:2 y:2 戻り値:0
// x:3 y:2 戻り値:1
// x:3 y:123 戻り値:-120
// x:-10 y:123 戻り値:-113
console.log(typedArrayToSorted);
// 出力:Int32Array(6) [1, 2, 2, 3, -10, 123, (省略) ]
console.log(typedArrayToSorted_B);
// 出力:Int32Array(6) [2, 3, -10, 1, 2, 123, (省略) ]
// toSorted【ソート (配列変更なし)】空配列
const typedArrayToSorted_Empty = new Int32Array([]);
typedArrayToSorted = typedArrayToSorted_Empty.toSorted(func);
console.log(typedArrayToSorted.length);
// 出力:0
// toSorted【ソート (配列変更なし)】関数不正
try {
typedArrayToSorted = typedArrayToSorted_C.toSorted(null);
} catch(e) {
console.log(e);
// 出力:TypeError: The comparison function must be either a function or undefined
}