配列と集合

43633 ワード

アレイの作成


未定義の1万要素の配列に初期化します.
const bigEmptyArray = []
bigEmptyArray.length = 10000
類似の配置オブジェクトから配置要素を収集します.類似配列-likeオブジェクトとは、長さが整数のプロパティ、または「0」、「1」、「2」を指します.等連続名を持つpropertyと同じオブジェクト.
const arrayLike = { length: 3 , '0': 'Peter', '1': 'Paul', '2': 'Mary'}
const elements = Array.from(arrayLike)
elements // ['Peter', 'Paul', 'Mary']
Array.isArray(arrayLike) // false
Array.isArray(elements) // true
Array.fromメソッドの2番目のパラメータを0からlength-1までのインデックス値を返す関数として受信すると、要素とインデックスが渡されます.
const square = Array.from({length: 5}, (element, index) => index * index )
square // [0, 1, 4, 9, 16]

長さと索引の割合


配列の長さは0~2^32-1の数値です.配列はlength propertyとinformix property「1」、「2」、「3」...所有するオブジェクト.propertyキーは常に文字列です.

要素の削除と追加


配列の最後に要素を追加したり、最後の要素を削除したりする方法では、配列の長さも変更されます.
let arr = [0, 1, 4, 9, 16, 25]
const deletedElement = arr.pop()
const newLength = arr.push('x')
arr // [0, 1, 4, 9, 16, 'x']
deletedElement // 25
newLength // 6
配列の前に要素を追加したり、最初の要素を削除したりする方法では、配列の長さも変更されます.
arr = [0, 1, 4, 9, 16, 25]
const deletedElement = arr.shift() 
const newLength = arr.unshift('x') 
arr // ['x', 1, 4, 9, 16, 25]
deletedElement // 0
newLength // 6

arr.push(15,25) 
arr // ['x', 1, 4, 9, 16, 25, 15, 25]
arr.unshift(0,1,4) 
arr // [0, 1, 4, 'x', 1, 4, 9, 16, 25, 15, 25]
spliceはarr.splice(start,deleteCount,x 1,x 2,...)
arr = [0, 1, 12, 24, 36]
const start = 2
arr.splice(start, 2, 16, 25) // [12, 24]
arr // [0, 1, 16, 25, 36]
arr.splice(start, 0, 4, 9) // []
arr // [0, 1, 4, 9, 16, 25, 36]
arr.splice(start, 2) // [4, 9]
arr // (5) [0, 1, 16, 25, 36]
arr.splice(start) // [16, 25, 36]
arr // [0, 1]

配列変更者mutator


arr.fill(value,start,end)-既存の要素を新しい要素で上書きします.
Arr.copyWithin(targetIndex,start,end)-既存の要素を同じ配列の他の要素で上書きします.
let arr = [0, 1, 4, 9, 16, 25]
arr.copyWithin(0, 1) // [1, 4, 9, 16, 25, 25]
arr.copyWithin(1) // [1, 1, 4, 9, 16, 25]
arr.fill(7, 3, -1) // [1, 1, 4, 7, 7, 25]
arr.reverse() // [25, 7, 7, 4, 1, 1]
arr.sort(comparisonFunction)
比較機能(x,y)-負数xをyより前、正の値xをyより後と区別できない
arr = [0, 1, 13, 33, 4, 8]
arr.sort((x,y) => x-y) // [0, 1, 4, 8, 13, 33]
arr.sort() //  [0, 1, 13, 33, 4, 8]
比較関数が指定されていない場合、sort関数は要素を文字列に変換して比較します.


要素の作成


ここで説明する方法は、既存の配列の内容を変更するのではなく、既存の配列に何らかの演算を適用した結果を新しい配列として作成します.
arr1 = [0, 1, 13, 33, 4, 8]
arr1.slice(1, 2) // [1]
arr1 // [0, 1, 13, 33, 4, 8]

arr2 = [[1, 2], [3, 4]]
arr2.flat() // [1, 2, 3, 4]

arr1.concat(9,8, arr2) // [0, 1, 13, 33, 4, 8, 9, 8, Array(2), Array(2)]
// = [...arr1, 9, 8, ...arr2]

要素の検索


配列に特定の値があることを確認
arr.include(target, start) // 참, 거짓
arr.indexOf(target, start) // 첫인덱스 , -1
arr.lastIndexOf(target, start) // 마지막인덱스, -1
arr.findIndex(conditionFunction) // 조건에 맞는 첫번째 인덱스
arr.find(conditionFunction) // 조건에 맞는 첫번째 요소

arr3 = [0, 1, 13, 33, 4, 8, 9, 8]
arr3.find(x => x > 20) // 33
arr3.some(x => x > 20) // true
arr3.every(x => x > 20) // false
次の方法の条件関数では、配列要素、インデックス、および配列全体を条件関数の係数として受け入れます.
arr.find
arr.every
arr.some
arr.filter

すべての要素にアクセス


forループは0とlength-1の間のすべてのインデックス値にアクセスし、欠落した要素は未定義を返します.逆に、for inループは存在するキー値のみにアクセスします.
for (const e of arr) {
  // 요소 e로 작업수행
}

for (const i in arr) {
  // 인덱스 i 와 요소 arr[i] 로 작업수행
}

for ( const [index, element] of arr.entries()) {
  // 인덱스 i 와 요소 element 로 작업수행
}

arr.forEach((element, index) => console.log(element, index))
for (const index in arr) console.log(arr[index], index)
arr.forEach(f)メソッドは、各要素に対してf(element、index、arr)を呼び出す.漏れた要因は省略する.
arr.map(f)は、f(element、index、arr)の結果値を含む配列を返す.
[1,7,2,9].map(x => x * x) // [1, 49, 4, 81]
[1,7,2,9].join(' and ') // '1 and 7 and 2 and 9'
forEach、map、filter、find、findIndex、someおよびeachメソッドの関数fは、関数パラメータの後に選択パラメータthisArgを受け入れる.thisArgは関数fのthisパラメータとなる.インデックスごとにthisArgを使用します.f(element,index,arr)関数を呼び出します.

疎配列


1つ以上の要素が欠けている配列を疎配列と呼びます.
  • アレイ文字に要素がない
  • の長さ以外にタイル
  • を追加
  • の長さ
  • を増加
  • 要素
  • を削除
    somNumber = [,2,,9]
    somNumber[100] = 1
    somNumber.length[200]
    delete someNumber[1]
    アレイapiの大部分は、疎アレイで欠落している要素を省略している.たとえば、foreachが省略した要素.反対Arrayfrom(arrayLike,f)は例外であり、すべての要素にfを呼び出し、欠落した要素はundefinedを返す.
    配列を指定すると、新しい配列を返すほとんどの方法では、欠落した要素が保持されます.
    sortメソッドは、欠落した要素を後ろに配置します.フィルタ関数で除去できる要素
    Array.from([,,9,10,,1])  // [undefined, undefined, 9, 10, undefined, 1]
    [,2,,9].map(x => x*x) // [, 4, , 81]
    [,2,,9].sort() // [2, 9, , ,]
    [,2,,9].filter( x => true ) // [2, 9]

    へいぶん


    mapメソッドは、集合内のすべての要素が1つの引数しかない限り、関数unary関数を適用します.このセクションで説明するreduce、reduceRightメソッドでは、2つの要素を結合する2つの演算マルチバイナリ演算子を使用します.
    const arr = [1,7,2,9]
    const result = arr.reduce((x,y) => x + y)
    result // 19
    arr.reduce((x,y) => 10 * x + y) // 1729
    arr.reduce((accum,current) => accum - current, 0) // -19
    Reduceのコールバック関数は、実際には次の4つのパラメータを受け入れます.
    (累積値、現在の配列要素、現在の配列要素のインデックス、配列全体)
    function findAll(arr, condition) {
      return arr.reduce(
        (accum, current, currentIndex) => 
        	condition(current) ? [...accum, currentIndex] : accum,
        []
      )
    }
    const odds = findAll([1,7,2,9], x => x % 2 !== 0) // [0, 1, 3]
    文字列周波数マッピング
    
    // loop 
    const freq = {}
    for (const c of 'Mississippi') {
      if (c in freq) {
        freq[c] ++
      } else {
        freq[c] = 1
      }
    } // {M: 1, i: 4, s: 4, p: 2}
    
    
    // reduce
    [...'Mississippi'].reduce(
      (freq, c) => ({...freq, [c]: (c in freq ? freq[c] + 1: 1) }),
      {}) // {M: 1, i: 4, s: 4, p: 2}
    

    地図


    すべてのJavaScriptオブジェクトはマッピングされますが、Mapクラスを直接使用するメリットは次のとおりです.
  • オブジェクトキーは文字列またはシンボルでなければなりませんが、Mapキーはフォーマットに制限されません.
  • Mapインスタンスは、要素を追加する順序を記憶します.
  • オブジェクトとは異なり、Mapにはプロトタイプチェーンはありません.
  • size propertyでは、プロジェクトの数を確認できます.
  • const weekdays = new Map(
     [["Mon", 0], ["Tue", 1], ["Wed", 2], ["Thu", 3], ["Fri", 4], ["Sat", 5], ["Sun", 6], ])
    // Map(7) {'Mon' => 0, 'Tue' => 1, 'Wed' => 2, 'Thu' => 3, 'Fri' => 4, …}
    
    const emptyMap = new Map()
    // 항목추가 연쇄적으로 호출가능
    map.set(key1, value1).set(key2, value2)
    // 항목삭제 , clear 모두 삭제
    map.delete(key) //  // Returns true if the key was present, false otherwise
    // 키존재여부
    if (map.has(key)) . . .
    // 키의 값
    const value = map.get(key)   // Returns undefined if the key is not present
    
    // 모든항목 루프
    for (const [key, value] of map) {
     console.log(key, value)
    }
    
    map.forEach((key, value) => {
     console.log(key, value)
    })

    セット


    集合重複を許さない要素の集合構造
    const weekdays = new Set(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'])
    //  {'Mon', 'Tue', 'Wed', 'Thu', 'Fri', …}
    const emptySet = new Set()
    const setWithElements = new Set(iterable
    set.add(x)
     // Adds x if not present and returns set for chaining
    set.delete(x)
     // If x is present, deletes x and returns true, otherwise returns false
    set.has(x) // Returns true if x is present
    set.clear() // Deletes all elements
    
    for (const value of set) {
     console.log(value)
    }
    
    set.forEach(value => {
     console.log(value)
    })

    Week MapとWeek Set WeakMap WeakSet


    作業概要
  • キーはオブジェクト
  • でなければなりません.
  • キーを使用するオブジェクトが参照されていない場合、そのオブジェクトはメモリとビットマップから
  • を自動的に削除します.
  • weakMap.get(key), weakMap.set(key, value), weakMap.delete(key), weakMap.has(key)
  • 週刊誌
  • オブジェクト
  • のみを格納.
  • オブジェクトは、到着可能なときのみメモリに
  • を保持する.
  • add, has, delete
  • パターンタイプパターンのフォーマット


    同じフォーマットからなる一連の数値を効率的に格納するには、形式化配列を使用します.
    Int8Array
    Uint8Array
    Uint8ClampedArray
    Int16Array
    Uint16Array
    Int32Array
    Uint32Array
    Float32Array
    Float64Array

    ArrayBuffer


    ファイル、データストリーム、画像などを含む連続バイトシーケンスを指す.形式化された配列のデータもArrayBufferに格納される.
    複数のWeb API(File API、XMLHttpRequest、WebSocket)がArrayBufferを返します.

    練習問題