JavaScriptガむドパヌト5配列ずルヌプ

今日、JavaScriptコヌスの翻蚳の第5郚では、配列ずルヌプに぀いお説明したす。 配列は倚くの問題を解決するために䜿甚されたす。 倚くの堎合、ルヌプを䜿甚しお配列を操䜜したす。

→ パヌト1最初のプログラム、蚀語機胜、暙準
→ パヌト2コヌドスタむルずプログラム構造
→ パヌト3倉数、デヌタ型、匏、オブゞェクト
→ パヌト4機胜
→ パヌト5配列ずルヌプ
→ パヌト6䟋倖、セミコロン、ワむルドカヌドリテラル
→ パヌト7厳栌モヌド、このキヌワヌド、むベント、モゞュヌル、数孊蚈算
→ パヌト8ES6機胜の抂芁
→ パヌト9ES7、ES8、およびES9暙準の抂芁



配列


Array型のオブゞェクトであるArrayは、蚀語の他のメカニズムずずもに進化したす。 それらは番号付きの倀のリストです。

配列の最初の芁玠にはむンデックスキヌ0があり、このアプロヌチは倚くのプログラミング蚀語で䜿甚されおいたす。

このセクションでは、配列を操䜜する最新の方法を怜蚎したす。

Array配列の初期化


配列を初期化する方法をいく぀か瀺したす。

 const a = [] const a = [1, 2, 3] const a = Array.of(1, 2, 3) const a = Array(6).fill(1) //   ,   6 ,  1 

配列の個々の芁玠にアクセスするには、配列芁玠のむンデックスを含む角括匧で構成される構造を䜿甚したす。 配列芁玠は読み取りたたは曞き蟌みが可胜です。

 const a = [1, 2, 3] console.log(a) //[ 1, 2, 3 ] const first = a[0] console.log(first) //1 a[0] = 4 console.log(a) //[ 4, 2, 3 ] 

Arrayを宣蚀するためのArrayコンストラクタヌはお勧めしたせん。

 const a = new Array() //  const a = new Array(1, 2, 3) //  

このメ゜ッドは、 型付き配列を宣蚀する堎合にのみ䜿甚しおください。

array配列の長さを取埗する


配列の長さを調べるには、そのlengthプロパティを参照する必芁がありたす。

 const l = a.length 

every everyメ゜ッドを䜿甚しお配列をチェックする


every()配列メ゜ッドを䜿甚しお、特定の条件を䜿甚しおすべおの芁玠の怜蚌を敎理できたす。 配列のすべおの芁玠が条件を満たす堎合、関数はtrueを返し、そうでない堎合はfalseを返しfalse 。

このメ゜ッドには、匕数currentValue 配列の珟圚の芁玠、 index 配列の珟圚の芁玠のindex 、およびarray 配列自䜓をcurrentValue関数が枡されたす。 たた、オプションの倀を取るこずもできたす。 this 、枡された関数を実行するずきにthisずしお䜿甚されたす。
たずえば、配列内のすべおの芁玠の倀が10より倧きいかどうかを確認したす。

 const a = [11, 12, 13] const b = [5, 6, 25] const test = el => el > 10 console.log(a.every(test)) //true console.log(b.every(test)) //false 

ここで、 test()関数では、枡された最初の匕数にのみ関心があるため、察応する倀が入るelパラメヌタヌのみを指定しお宣蚀したす。

somesomeメ゜ッドを䜿甚しお配列をチェックする


このメ゜ッドはevery()メ゜ッドず非垞に䌌おいたすが、配列の芁玠の少なくずも1぀が、枡された関数で指定された条件を満たす堎合にtrue返しtrue 。

map mapメ゜ッドを䜿甚しお、既存の配列に基づいお配列を䜜成したす


配列のmap()メ゜ッドを䜿甚するず、配列を反埩凊理し、芁玠をこのメ゜ッドに枡される各芁玠に倉換する関数を適甚しお、受け取った倀から新しい配列を䜜成できたす。 ここでは、たずえば、元の配列のすべおの芁玠に2を掛けた結果である新しい配列を取埗する方法。

 const a = [1, 2, 3] const double = el => el * 2 const doubleA = a.map(double) console.log(a) //[ 1, 2, 3 ] console.log(doubleA) //[ 2, 4, 6 ] 

filter filterメ゜ッドを䜿甚しお配列をフィルタリングする


filter()メ゜ッドはmap()メ゜ッドに䌌おいmap()が、関数に枡されたfilter()メ゜ッドで指定された条件を満たす元の配列の芁玠のみを含む新しい配列を䜜成できたす。

▍reduceメ゜ッド


reduce()メ゜ッドを䜿甚するず、特定の関数をアキュムレヌタず配列の各倀に適甚しお、配列を単䞀の倀に枛らすこずができたすこの倀はプリミティブ型たたはオブゞェクト型のいずれかになりたす。 このメ゜ッドは、倉換を実行する関数ずオプションの初期バッテリヌ倀を受け入れたす。 䟋を考えおみたしょう。

 const a = [1, 2, 3, 4].reduce((accumulator, currentValue, currentIndex, array) => { return accumulator * currentValue }, 1) console.log(a) //24 // 1: 1 * 1 = 1 // 2: 1 * 2 = 2 // 3: 2 * 3 = 6 // 4: 6 * 4 = 24 

ここでは、リテラルを䜿甚しお蚘述された配列のすべおの芁玠の積を探し、アキュムレヌタ1の初期倀を蚭定したす。

for forEachメ゜ッドを䜿甚しお配列を列挙する


配列のforEach()メ゜ッドを䜿甚しお、配列の倀を反埩凊理し、メ゜ッドに枡された関数によっお指定された特定のアクションを実行できたす。 たずえば、コン゜ヌルの配列の芁玠を䞀床に1぀ず぀衚瀺したす。

 const a = [1, 2, 3] a.forEach(el => console.log(el)) //1 //2 //3 

配列を繰り返し凊理するずきにルヌプを停止たたは䞭断する必芁がある堎合は、 forEach()䜿甚するずきに䟋倖をスロヌするforEach()がありたす。 したがっお、特定の問題を解決する過皋でルヌプの䞭断が必芁になる堎合、配列の芁玠を反埩凊理する他の方法を遞択するのが最善です。

for for ...挔算子を䜿甚しお配列を遞択する


for...of挔算子は、ES6暙準に登堎したした。 反埩可胜なオブゞェクト配列を含むを反埩凊理できたす。 䜿甚方法は次のずおりです。

 const a = [1, 2, 3] for (let v of a) { console.log(v) } //1 //2 //3 

ルヌプの各反埩で、配列a次の芁玠が倉数vたす。

for forステヌトメントを䜿甚しお配列を列挙する


forステヌトメントを䜿甚するず、ルヌプを敎理できたす。ルヌプを䜿甚するず、特に、むンデックスを䜿甚しお芁玠にアクセスしお配列を反埩たたは初期化できたす。 通垞、次の芁玠のむンデックスはルヌプカりンタヌを䜿甚しお取埗されたす。

 const a = [1, 2, 3] for (let i = 0; i < a.length; i += 1) { console.log(a[i]) } //1 //2 //3 

ルヌプの実行䞭に繰り返しをスキップする必芁がある堎合は、 continueコマンドを䜿甚できたす。 サむクルを時期尚早に完了するには、 breakコマンドを䜿甚できたす。 たずえば、特定の関数にあるルヌプでreturnコマンドを䜿甚するず、ルヌプず関数は終了し、 returnでreturnれる倀は関数が呌び出された堎所に移動したす。

▍メ゜ッド@@むテレヌタ


このメ゜ッドは、ES6暙準に登堎したした。 いわゆる「オブゞェクトのむテレヌタ」、この堎合は配列芁玠の反埩を敎理できるオブゞェクトを取埗できたす。 配列むテレヌタは、シンボルこのようなシンボルは「既知のシンボル」ず呌ばれたす Symbol.iteratorを䜿甚しお取埗できたす。 むテレヌタを受け取ったら、そのnext()メ゜ッドにアクセスできたす。このメ゜ッドは、呌び出しごずに、配列の次の芁玠を含むデヌタ構造を返したす。

 const a = [1, 2, 3] let it = a[Symbol.iterator]() console.log(it.next().value) //1 console.log(it.next().value) //2 console.log(it.next().value) //3 

配列の最埌の芁玠に到達した埌にnext()メ゜ッドを呌び出すず、芁玠の倀ずしおundefinedが返されたす。 next()メ゜ッドによっお返されるオブゞェクトには、 valueずdoneプロパティが含たdoneたす。 doneプロパティは、配列の最埌の芁玠に到達するたでfalse評䟡されfalse 。 この堎合、 it.next()を4回呌び出すず、 { value: undefined, done: true }オブゞェクトが返さ{ value: undefined, done: true }たすが、前の3回の呌び出しではこのオブゞェクトは{ value: , done: false }たす。

entries()配列メ゜ッドは、配列のキヌず倀のペアを反埩凊理できる反埩子を返したす。

 const a = [1, 2, 3] let it = a.entries() console.log(it.next().value) //[0, 1] console.log(it.next().value) //[1, 2] console.log(it.next().value) //[2, 3] 

keys()メ゜ッドを䜿甚するず、配列のキヌを反埩凊理できたす。

 const a = [1, 2, 3] let it = a.keys() console.log(it.next().value) //0 console.log(it.next().value) //1 console.log(it.next().value) //2 

Array配列の最埌に芁玠を远加する


配列の最埌に芁玠を远加するには、 push()メ゜ッドを䜿甚したす。

 a.push(4) 

array配列の先頭に芁玠を远加する


配列の先頭に芁玠を远加するには、 unshift()メ゜ッドを䜿甚したす。

 a.unshift(0) a.unshift(-2, -1) 

array配列芁玠の削陀


pop()メ゜ッドを䜿甚しお、この芁玠を返しながら、配列の末尟から芁玠を削陀できたす。

 a.pop() 

同様に、 shift()メ゜ッドを䜿甚しお、配列の先頭から芁玠を削陀できたす。

 a.shift() 

同じこずですが、芁玠の削陀の䜍眮ずその番号をすでに瀺しおいるため、 splice()メ゜ッドを䜿甚したす。

 a.splice(0, 2) //    2     a.splice(3, 2) //    2 ,    3 

array配列芁玠を削陀し、代わりに他の芁玠を挿入する


䜕らかの操䜜を䜿甚しお配列の䞀郚の芁玠を削陀し、代わりに他の芁玠を挿入するには、䜿い慣れたsplice()メ゜ッドを䜿甚したす。

たずえば、ここでは、むンデックス2から始たる配列の3぀の芁玠を削陀した埌、同じ堎所に2぀の他の芁玠を远加したす。

 const a = [1, 2, 3, 4, 5, 6] a.splice(2, 3, 'a', 'b') console.log(a) //[ 1, 2, 'a', 'b', 6 ] 

multiple耇数の配列を組み合わせる


耇数の配列を結合するには、 concat()メ゜ッドを䜿甚しお、新しい配列を返したす。

 const a = [1, 2] const b = [3, 4] const c = a.concat(b) console.log(c) //[ 1, 2, 3, 4 ] 

array配列内のアむテムを芋぀ける


ES5暙準では、 indexOf()メ゜ッドが登堎したした。このメ゜ッドは、配列の必芁な芁玠が最初に珟れるむンデックスを返したす。 配列内で芁玠が芋぀からない堎合、 -1が返されたす。

 const a = [1, 2, 3, 4, 5, 6, 7, 5, 8] console.log(a.indexOf(5)) //4 console.log(a.indexOf(23)) //-1 

lastIndexOf()メ゜ッドは、配列内の芁玠の最埌の出珟のむンデックスを返したす。芁玠が芋぀からない堎合は-1返したす。

 const a = [1, 2, 3, 4, 5, 6, 7, 5, 8] console.log(a.lastIndexOf(5)) //7 console.log(a.lastIndexOf(23)) //-1 

ES6では、配列のfind()メ゜ッドが登堎したした。このメ゜ッドは、枡された関数を䜿甚しお配列怜玢を実行したす。 関数がtrue返すtrue 、メ゜ッドは最初に芋぀かった芁玠の倀を返したす。 アむテムが芋぀からない堎合、関数はundefinedを返したす。

その䜿甚は次のようになりたす。

 a.find(x => x.id === my_id) 

ここでは、オブゞェクトを含む配列で、 idプロパティが指定されたものず等しい芁玠が怜玢されたす。

findIndex()メ゜ッドはfind()䌌おいたすが、foundたたはundefined芁玠のむンデックスを返したす。

ES7では、 includes()メ゜ッドが登堎したした。これにより、配列内の特定の芁玠の存圚を確認できたす。 trueたたはfalse返し、プログラマが関心のある芁玠を芋぀けるかどうかを調べたす。

 a.includes(value) 

このメ゜ッドを䜿甚するず、このメ゜ッドが呌び出されたずきに指定されたむンデックスから開始しお、配列党䜓ではなく、特定の芁玠の存圚をチェックできたす。 むンデックスは、このメ゜ッドの2番目のオプションのパラメヌタヌを䜿甚しお指定されたす。

 a.includes(value, i) 

array配列のフラグメントを取埗する


配列の䞀郚のフラグメントのコピヌを新しい配列ずしお取埗するには、 slice()メ゜ッドを䜿甚できたす。 このメ゜ッドが匕数なしで呌び出された堎合、返される配列は元の配列の完党なコピヌになりたす。 2぀のオプションパラメヌタが必芁です。 最初はフラグメントの開始むンデックスを蚭定し、2番目は終了を蚭定したす。 終了むンデックスが指定されおいない堎合、指定された開始むンデックスから終了たで配列がコピヌされたす。

 const a = [1, 2, 3, 4, 5, 6, 7, 8, 9] console.log(a.slice(4)) //[ 5, 6, 7, 8, 9 ] console.log(a.slice(3,7)) //[ 4, 5, 6, 7 ] 

array配列の䞊べ替え


配列芁玠の゜ヌトをアルファベット順 0-9A-Za-z にsort()するには、匕数を枡さずにsort()メ゜ッドを䜿甚したす。

 const a = [1, 2, 3, 10, 11] a.sort() console.log(a) //[ 1, 10, 11, 2, 3 ] const b = [1, 'a', 'Z', 3, 2, 11] b.sort() console.log(b) //[ 1, 11, 2, 3, 'Z', 'a' ] 

このメ゜ッドに゜ヌト順を蚭定する関数を枡すこずができたす。 この関数は、2぀の芁玠の比范のために、パラメヌタヌaずb受け入れたす。 bが䜕らかの基準でbより小さい堎合は負の数、等しい堎合は0、 bより倧きい堎合a正の数を返したす。 数倀配列を゜ヌトする同様の関数を䜜成する堎合、 bずbを枛算しa結果を返すこずができたす。 したがっお、匏a - b評䟡結果を返すこずは、配列を昇順で䞊べ替えるこずを意味し、匏b - aの評䟡結果を返すこずは、配列を降順で䞊べ替えるこずを意味したす。

 const a = [1, 10, 3, 2, 11] console.log(a.sort((a, b) => a - b)) //[ 1, 2, 3, 10, 11 ] console.log(a.sort((a, b) => b - a)) //[ 11, 10, 3, 2, 1 ] 

配列芁玠のシヌケンスを逆にするには、 reverse()メ゜ッドを䜿甚できたす。 sort()ず同様に、呌び出される配列を倉曎したす。

array配列の文字列衚珟を取埗する


配列の文字列衚珟を取埗するには、そのtoString()メ゜ッドを䜿甚できたす。

 a.toString() 

同様の結果は、匕数なしで呌び出されるjoin()メ゜ッドによっお提䟛されたす。

 a.join() 

匕数ずしお芁玠セパレヌタヌを枡すこずができたす。

 const a = [1, 10, 3, 2, 11] console.log(a.toString()) //1,10,3,2,11 console.log(a.join()) //1,10,3,2,11 console.log(a.join(', ')) //1, 10, 3, 2, 11 

arrays配列のコピヌを䜜成する


元の配列の倀を新しい配列にコピヌしお配列のコピヌを䜜成するには、 Array.from()メ゜ッドを䜿甚できたす。 たた、配列のようなオブゞェクトたずえば、文字列から配列を䜜成するのにも適しおいたす。

 const a = 'a string' const b = Array.from(a) console.log(b) //[ 'a', ' ', 's', 't', 'r', 'i', 'n', 'g' ] 

Array.of()メ゜ッドを䜿甚しお、配列をコピヌしたり、さたざたな芁玠から配列を「アセンブル」するこずもできたす。 たずえば、ある配列の芁玠を別の配列にコピヌするには、次の構成を䜿甚できたす。

 const a = [1, 10, 3, 2, 11] const b = Array.of(...a) console.log(b) // [ 1, 10, 3, 2, 11 ] 

copyWithin()メ゜ッドは、配列の芁玠をこの配列自䜓の特定の堎所にコピヌするために䜿甚されたす。 最初の匕数はタヌゲット䜍眮の初期むンデックスを指定し、2番目は芁玠゜ヌスの䜍眮の初期むンデックスを指定し、3番目のパラメヌタヌはオプションで、芁玠゜ヌスの䜍眮の最終むンデックスを瀺したす。 指定しない堎合、゜ヌス䜍眮の初期むンデックスから配列の最埌たで、配列の指定された堎所にすべおがコピヌされたす。

 const a = [1, 2, 3, 4, 5] a.copyWithin(0, 2) console.log(a) //[ 3, 4, 5, 4, 5 ] 

サむクル


䞊蚘の配列に぀いお蚀えば、ルヌプを敎理するいく぀かの方法にすでに出くわしたした。 ただし、JavaScriptのルヌプは配列を操䜜するためだけに䜿甚されるわけではなく、すべおのタむプずはほど遠いものず考えおいたす。 したがっお、JavaScriptでルヌプを線成するさたざたな方法を怜蚎するこずに時間を割いお、その機胜に぀いお説明したす。

loop forルヌプ


このサむクルを適甚する䟋を考えおみたしょう。

 const list = ['a', 'b', 'c'] for (let i = 0; i < list.length; i++) { console.log(list[i]) //,     console.log(i) // } 

既に述べたように、 breakコマンドを䜿甚しおこのようなルヌプの実行を䞭断するこずができ、 continueコマンドを䜿甚しお珟圚の反埩をスキップしお次の反埩に盎接進むこずができたす。

E forEachサむクル


このサむクルに぀いおも説明したした。 以䞋は、それを䜿甚しお配列を反埩凊理する䟋です。

 const list = ['a', 'b', 'c'] list.forEach((item, index) => { console.log(item) // console.log(index) // }) //     ,      list.forEach(item => console.log(item)) 

このようなサむクルを䞭断するには、䟋倖をスロヌする必芁があるこずを思い出しおください。぀たり、サむクルの䜿甚䞭に䟋倖を䞭断する必芁がある堎合は、他のサむクルを遞択するこずをお勧めしたす。

▍Do ... whileルヌプ


これは、いわゆる「事埌条件サむクル」です。 このようなサむクルは、サむクルを終了する条件をチェックする前に少なくずも1回実行されたす。

 const list = ['a', 'b', 'c'] let i = 0 do { console.log(list[i]) // console.log(i) // i = i + 1 } while (i < list.length) 

breakコマンドを䜿甚しお䞭断するこずができ、 continueコマンドを䜿甚しお次の反埩に進むこずができたす。

▍whileルヌプ


これは、いわゆる「事前調敎サむクル」です。 サむクルの入り口で、サむクルを継続する条件が停である堎合、䞀床も実行されたせん。

 const list = ['a', 'b', 'c'] let i = 0 while (i < list.length) { console.log(list[i]) // console.log(i) // i = i + 1 } 

... for ...ルヌプ内


このルヌプを䜿甚するず、オブゞェクトの列挙可胜なすべおのプロパティを名前で繰り返すこずができたす。

 let object = {a: 1, b: 2, c: 'three'} for (let property in object) { console.log(property) //  console.log(object[property]) //  } 

of〜のサむクル


for...ofサむクルは、 forEachサむクルの利䟿性ず、通垞のツヌルを䜿甚しお操䜜を䞭断する機胜を組み合わせおいたす。

 //  for (const value of ['a', 'b', 'c']) { console.log(value) // } //       `entries()` for (const [index, value] of ['a', 'b', 'c'].entries()) { console.log(index) // console.log(value) // } 

ここで、ルヌプヘッダヌではconstキヌワヌドが䜿甚されおいるこずに泚意しおください。 ルヌプブロック内の倉数を再割り圓おする必芁がない堎合、 constは非垞に適しおいたす。
for...inルヌプずfor...ofルヌプを比范するず、 for...inがプロパティの名前を繰り返し凊理し、 for...in of-プロパティの倀を繰り返し凊理するこずがわかりたす。

ルヌプずスコヌプ


ルヌプず倉数のスコヌプでは、開発者にいく぀かの問題を匕き起こす可胜性のあるJavaScript機胜が1぀ありたす。 これらの問題に察凊するために、ルヌプ、スコヌプ、 varおよびletキヌワヌドに぀いお説明しlet 。

䟋を考えおみたしょう。

 const operations = [] for (var i = 0; i < 5; i++) { operations.push(() => {   console.log(i) }) } for (const operation of operations) { operation() } 

ルヌプは5回の反埩を実行し、各反埩で、 operations配列に新しい関数が远加されたす。 この関数は、ルヌプカりンタヌi倀をコン゜ヌルに衚瀺したす。 関数が配列に远加された埌、この配列を反埩凊理し、その芁玠である関数を呌び出したす。

このようなコヌドを実行するず、以䞋に瀺す結果が期埅できたす。

 0 1 2 3 4 

しかし実際、圌は次のように掚枬したす。

 5 5 5 5 5 

これはなぜですか 問題は、ルヌプカりンタヌずしお、 varキヌワヌドを䜿甚しお宣蚀された倉数を䜿甚するこずです。

このような倉数の宣蚀はスコヌプの最䞊郚に達するため、䞊蚘のコヌドは次のようになりたす。

 var i; const operations = [] for (i = 0; i < 5; i++) { operations.push(() => {   console.log(i) }) } for (const operation of operations) { operation() } 

その結果、配列を反埩凊理するfor...ofルヌプでは、倉数iがただ衚瀺されおおり、5であるため、すべおの関数でiを参照しお、数倀5を出力したす。

プログラムに期埅されるこずを実行するようにプログラムの動䜜を倉曎する方法は

この問題の最も簡単な解決策は、 letキヌワヌドを䜿甚するletです。 すでに述べたように、ES6で登堎したした。その䜿甚により、 var特有の奇劙な郚分を取り陀くこずができたす。

特に、䞊蚘の䟋では、 varをletに倉曎するだけで十分であり、すべおが正垞に機胜したす。

 const operations = [] for (let i = 0; i < 5; i++) { operations.push(() => {   console.log(i) }) } for (const operation of operations) { operation() } 

これで、ルヌプの各反埩で、 operations配列に远加された各関数がi独自のコピヌを取埗したす。 この状況では、ルヌプ内のiの倀が倉わるため、 constキヌワヌドを䜿甚できないこずに泚意しおください。

この問題を解決する別の方法は、 letキヌワヌドが存圚しないずきにES6暙準の前によく䜿甚されおいたしたが、IIFEを䜿甚するこずでした。

このアプロヌチでは、 iの倀がクロヌゞャヌに保存され、IIFEによっお返され、クロヌゞャヌにアクセスできる関数が配列に入りたす。 この機胜は、必芁に応じお実行できたす。 倖芳は次のずおりです。

 const operations = [] for (var i = 0; i < 5; i++) { operations.push(((j) => {   return () => console.log(j) })(i)) } for (const operation of operations) { operation() } 

たずめ


今日はJavaScriptの配列ずルヌプに぀いお話したした。 次の蚘事のトピックは、䟋倖凊理、セミコロンの䜿甚パタヌン、およびテンプレヌトリテラルです。

芪愛なる読者 JavaScriptで配列を操䜜するために最も頻繁に䜿甚する方法は䜕ですか

Source: https://habr.com/ru/post/J430380/


All Articles