整列

3369 ワード

JavaScriptの配列は他の言語の配列とは異なる特徴がある.通常、同じサイズのメモリ領域は連続的に配置され、要素は緊密で、データ型は同じです.これは密配列と呼ばれ、インデックスを使用して迅速にアクセスできます.
JSのレイアウトは、異なるデータ型(メモリ容量が異なる場合がある)であってもよいし、不連続であってもよい.(これを疎配列と呼ぶ)JSの配列は、通常の配列に比べてインデックス方式で要素にアクセスする性能がやや劣る場合がありますが、特定の要素を検索、挿入、削除する際に、より良い性能が期待できます.
配列は次のように生成できます.
 const arr = [1,2,3];
 
 const arr2 = new Array(1,2,3); //[1,2,3]
 
 const arr3 = Array.of(1,2,3); //[1,2,3]
 
 const arr4 = Array.from({length:3},(_,i)=>i); // [0,1,2]
 const arr5 = Array.from('Hello'); // ['H','e','l','l','o']
 const arr6 = Array.from({length:2,0:'a',1:'b'); // ['a','b']
コンストラクション関数によって生成される係数は1であり、数値であれば対応する空の配列が生成されます.
Array.ofメソッドは、渡されるパラメータが要素である配列を生成します.
Array.fromメソッドは、類似した配列オブジェクトまたは小さなオブジェクトを配列に返します.2番目の引数に渡されるコールバック関数を使用して値を作成し、要素を塗りつぶし、コールバック関数から値を返す配列を返すことができます.理解を助けるなら、Array.from(obj, (mapFn, thisArg)) = Array.from(obj).map(mapfn,thisArg)は同じ意味です.
配列はインデックスとして参照でき、存在しない場所に近い場合はundefinedです.存在しない場所に割り当てると生成され,現在のアレイより大きい場所に割り当てると疎アレイが形成される.deleteは要素を削除できますが、空白領域は疎配列です.arr[1]から要素を削除する場合はarr.splice(1,1)を使用します.この場合、length値も2になります.length property値は、常に疎配列の実際の要素の数より大きい必要があります.削除すると3になります.
配列方法には、元の配列を直接変更する方法と非方法があります.
const arr = [1,2,2,3];
Array.isArray([]); // true
arr.indexOf(2,2); // 2, 없으면 -1, 두 번째 인수는 시작 위치이며 생략 가능

// 직접 변경
arr.push(3,4); // [1,2,2,3,3,4], 6 반환
arr.pop(); // [1,2,2,3,3], 4 반환
arr.unshift(4,3); // [4,3,1,2,2,3,3], 7 반환
arr.shift(); // [3,1,2,2,3,3], 4 반환
arr.splice(1,2,10,20); // [3,10,20,2,3,3], [1,2] 반환, (시작점, 제거 개수(생략시 시작점부터 끝), 제거 한 곳에 넣을 것)
arr.reverse(); // [3,3,2,20,10,3], [3,3,2,20,10,3] 반환
arr.fill(0,2,5); // [3,3,0,0,0,3], [3,3,0,0,0,3] 반환 (채울 것, 시작, 끝)
[1,[2,[3,[4]]]].flat(2); // [1,2,3,[4]], 전달한 값만큼 평탄화 함, 기본값 1

// 직접 변경하지 않는 것
const arr2 = [5,6];
const arr3 = [7,8];
let result = arr2.concat(arr3); // [5,6,7,8] 반환
let result2 = arr2.slice(0,2); // [5,6] 반환, 모두 생략시 모든 요소를 얕은 복사, (시작, 끝-1)
let result3 = arr2.join(':'); //'5:6' 반환, 기본값은 ,
let result4 = arr2.includes(2,0); //false (검색, 시작점)

forEach、map、filter、reduce、some、each、find、findIndexメソッドの役割は似ています.
すべての人が自分の配列の要素を呼び出し、コールバック関数を呼び出し、ソース配列を変更しません.
しかし、それぞれ少し違いがあります.
forEachは配列を返し、mapは配列を返し、filterは戻り値がtrueの要素のみからなる配列を返し、reduceは結果を返し、一部の戻り値はtrueであり、各戻り値はtrueであり、findは戻り値がtrueの最初の要素を返す.findIndexは、trueの値を返す最初の要素のインデックスが返されます.
代表的にはforeachとreduceだけを見ます.(典型例と特殊例)
class Numbers {
 numberArray = [];
 multiply(arr) {
  arr.forEach(item => this.numberArray.push(item * item));
 }
}

const numbers = new Numbers();
numbers.multiply([1,2,3]);
console.log(numbers.numberArray); // [1,4,9]


const values = [1,2,3,4,5,6];
const average = values.reduce((acc,cur,i,{length})=>{
 return i === length - 1 ? (acc + cur) / length : acc + cur;
 // 마지막 순회가 아니면 누적값 반환, 마지막이면 평균 반환
}, 0);
console.log(average); // 3.5
上記の例では、コールバック関数のthisバインドの問題を解決するために、前に説明した矢印関数を使用します.
foreachはbreak,continueなどで中断できず,疎配列部分が通過する.
reduceは(関数(累積値(最後の戻り値)、現在の要素値、現在のインデックス、呼び出された配列(これ)、および初期値)として呼び出されます.初期値は省略時に[0]にループして積算値、[1]は現在の要素値です.


インデックスは初期値によって変わります.