JS/ES – Array – filter

概要

Array.prototype.filter()は、コールバック関数を引数にとり、配列の各要素にコールバックの条件を適用した結果を新たな配列として返す。

[新たな配列] = [元の配列].filter(callback);

コールバックは引数を1つ取りtrue/falseを返す関数で、引数には元の配列の各要素が順次あてられ、条件がtrueの要素のみが残った配列が新たに生成される。

実行例

以下の例では、文字列を要素とする配列から文字列長が3文字以内の要素のみを取り出して新たな配列としている。元の配列は影響を受けない。

活用例~要素の削除

以下のように、配列の要素の内容を指定して削除することができる。同じ内容の要素が複数含まれる場合、すべて削除される。

 

JS/ES/JQuery – ストック

JQuery

プロパティーの設定

$([セレクター]).attr(属性名, 値);

取得

valueの取得

$([セレクター]).val();

連鎖

anchor要素を生成し、href属性にurlの文字列を設定し、表示文字列としてlink_nameを設定する。

 

JS/ES – JQuery – CSS

概要

JQueryでDOMのCSSの追加・変更・削除をするにはcss()メソッドを使う。

スタイルの設定

単一のプロパティー

css()メソッドの1つ目の引数にプロパティー、2つ目の引数に値を文字列で与えて、スタイルを設定する。

また、css()の第1引数だけにプロパティー名を指定すると、スタイルの値が得られる(以下の例では#00fで与えた色の値がrgb(0, 0, 255)で返されている)。

複数プロパティーの一括設定

css()の引数に連想配列(Object型)を与えて、複数のスタイルを一括指定する。連想配列のキーがプロパティー、値がスタイルの値になる。

複数のスタイルの値を確認するには、css()の引数に配列を与え、その配列の中で必要なスタイルプロパティーを複数指定する。戻り値は連想配列で返される。

スタイルの解除

css()の1つ目の引数にプロパティーを指定し、2つ目の引数を空文字列にすると、指定したスタイルが解除される。

 

JS/ES – JQuery – スクリプトの配置

概要

JavaScriptやJQueryの配置位置については、HTML要素の読み込みとの前後関係に注意しなければならない。

HTML要素の内容・スタイルの設定やイベントリスナーの登録など、オブジェクトの実体が必要な殆どの操作は、DOMが読み込まれた後に行う必要がある。

以下、JQueryのコードを中心に、コード配置について整理する。

不適切な配置

以下の例は、対象となるDOMが読み込まれる前にスクリプトが実行される。

このため、スクリプト実行段階ではDOMの実体が存在せず、意図したp要素の文字の色の設定は行われない。これはJavaScriptのコードでも同じ。

スクリプトをbodyの末尾に置く

以下の場合は、スクリプトがbodyの末尾に置かれていて、body内のDOMが全て読み込まれた後にスクリプトが実行される。

このため、スクリプト実行時にはDOMの実体が定まっていて、意図したp要素の色の変更が行われる。これもJavaScriptで書く場合と共通。

スクリプトをhead内に置く

DOM読み込み後に実行

$(document).ready(function() {});

&(document).ready()メソッドに渡した関数は、HTMLやDOMが読み込まれると実行される。

画像ファイルなどのリソースはまだ完全に読み込まれていない状態。

$(document).ready(() => {});

ready()に渡す関数をアロー関数で書くと、表現が簡略化される。

$(function {});

関数を直接JQueryの引数に渡す、redayメソッドよりも簡略化された書き方。

$(() => {});

JQueryに渡す関数をアロー関数にした、最も簡潔な書き方。

リソースの完全読み込み後に実行

$(window).onload(function() {});

DOMに続いて画像ファイルなどのリソースが完全に読み込まれた後に実行される。画像サイズの利用や変更を伴う場合にはこの方法で。

$(window).onload(() => {});

onloadの引数にアロー関数を渡すと、簡潔になる。

 

JS/ES – DOM – 要素の追加・変更・削除

概要

window.documentのメソッドによって、bodyや親要素に対して動的に要素を追加・変更・削除する方法。

なお要素のタグで囲まれたテキストの操作についてはこちらにまとめた。

要素の追加

要素の追加は以下の手順。

  1. document.createElement()で要素オブジェクトを生成
    • 引数で生成する要素名を指定
  2. 要素の内容やスタイルを設定
    • 要素のスタイルはCSSプロパティーで設定
    • 要素のテキストを設定
  3. 親要素のappendChild()メソッドの引数に追加する要素を指定して追加

bodyへの追加

bodyへの追加も他の親要素への追加と同じで、親要素としてdoccument.bodyを指定する。以下の例では、htmlに書かれたp要素に続けて動的にp要素を追加している。

appendChild()はbody要素が読み込まれた後でなければならない。イベントリスナーの登録タイミングと同じように、windows.onloadの中で実行するなど留意する必要あり(以下の例では要素の生成もonloadの中に書いているが、最低限appendChild()がここにあればよい)。

HTML

結果

親要素への追加

生成した要素を特定の親要素の子要素として登録する場合、親要素のappendChild()の引数に追加する要素を指定。

以下の例では、HTMLに書かれたdiv要素の中とその次にp要素を追加している。

HTML

結果

元から設置されたdiv要素

div要素の子要素としてp要素を追加

div要素の2番目の子要素としてp要素を追加

 

div要素の次にp要素を追加

要素の入れ替え

要素の入れ替えは、入れ替える要素の親要素のreplace()メソッドを実行する。1つ目の引数に入れ替え後の新しい要素を、2つ目の引数に入れ替えられる前の要素を指定する。

HTML

結果

置き換え用p要素の1つ目

元から設置されたp要素の2つ目

置き換え用p要素の2つ目

追加された要素の2つ目

要素の削除

要素を削除するには、その要素を含む親要素のremoveChild()メソッドに削除する要素を指定する。

以下の例では、HTMLに書かれた2つのp要素と動的に追加した2つのp要素から1つずつを削除している。

HTML

結果

元から設置されたp要素の2つ目です

追加された要素の2つ目です

 

JS/ES – イベントハンドリングの基本

概要

JavaScriptのイベントハンドリングの基本は(他の言語と同様に)、以下の手順を踏む。

  1. イベントを発生させるオブジェクトを生成する
  2. イベントリスナー(イベントハンドラー)を定義する
    • その際、捕捉したいイベントを指定する
  3. イベントリスナーをオブジェクトに登録する

以下、JSにおけるイベントリスナーの登録手順を整理する。

基本形式

最も基本に忠実な手順を如何に例示する。

具体的には、ボタンを配置し、クリックに対するリスナーを定義し、そのリスナーをボタンに登録している。

無名関数

以下の例では、無名関数としてリスナーを定義し、それを直接addEventListenerの引数としている。

無名関数を使っているので、リスナーを保持する変数は必要ない(リスナーに名前を付ける必要がない)。リスナーの処理内容が少ないときに使える。

メソッドチェーン

以下の例では、ボタンオブジェクトの取得とリスナーの登録をメソッドチェーンで行い、さらにリスナーを無名関数で渡している。

リスナーの処理コード量が多いときは、無名関数ではなく通常の関数定義とする。

 

JS/ES – 配列~Array

配列の定義

リテラル

配列のリテラルは他の言語と似ていて、[]の中に要素を','で区切って並べる。

空の配列も定義可能。

Arrayコンストラクター

Arrayクラスのコンストラクターで空の配列を作成可能。

要素の参照・追加

配列の要素の参照は他の言語と同じ。もちろん値の更新もできる。

新たに要素を追加するには、インデックスと値を指定。もちろん値の更新も可能。

配列の要素は、すべて同じ型でなくてもよい。

要素番号を飛ばして値を追加すると、その間は'empty'になる。

配列の長さ

配列の長さ(要素数)はlengthプロパティーで得られる。

先頭・末尾要素の取出し・追加・削除

配列の先頭要素・末尾要素について、追加や削除・取出しのメソッドが準備されていて、配列をキューやスタックのように使うことができる。詳細は配列の先頭・末尾要素の追加・削除にまとめている。

  • push~末尾追加
  • pop~末尾取出し・削除
  • unshift~先頭追加
  • shift~先頭取出し・削除

要素の取出し・削除・置換

splice~インデックス指定で取出し・削除・置換

splice()メソッドは指定したインデックスから指定した数の要素を削除する。追加する要素を指定した場合は指定した位置に要素が追加される。

filter~指定した内容の要素の取出し・削除

条件に一致する要素のみ取り出す場合、filter()メソッドを使う。filter()メソッドは非破壊的で新たな配列を生成する。

要素の内容を指定して削除する場合もfilter()で。

map~配列の要素の加工

map()メソッドは配列の各要素やインデックスなどの処理結果を要素とする配列を返す。

値とインデックスの順次取り出し

for文で値を取り出す

最も基本的なfor文の使い方で、インデックスを0~配列長−1まで変化させて直接参照する方法。

for...ofで値を直接取り出す

ES6のfor...of構文は、配列から要素を順次取り出してくれる(Pythonのfor...inと同じ動作)。

for...inでインデックスを取り出す

ES6のfor...inは配列からインデックスを順次取り出してくれる。ただし戻り値はStringなので要注意

entries()でインデックスと値を同時に取り出す

Array.prototype.entries()はインデックスと値の配列をイテレーションで返してくれる。

map()に値とインデックスの2つの引数を指定する

Array.prototype.map()は引数で指定したコールバック関数を各要素に適用した結果を配列として返す。通常は引数を1つ指定して配列の要素を得て、それに対して処理する。

map()は2つ目の引数を指定することができて、その場合2つ目の引数にはインデックスの値が入る。しかも、for…inと違ってインデックスは数値として得られる。

reducer~配列要素に対するイテレーション

samやmax/minメソッドはない

JSには多言語のように配列要素の合計や最大値を求める汎用の関数やメソッドが準備されていない。

その実装は、プログラムごとにArray.reduce()メソッドで行われているようだ。たとえば要素の合計を求める例を以下に示す。

配列の複製

const array_clone = [].concat(array)

const array_clone = array.slice(0, array.length)

const array_clone = [...array]

const array_clone = Array.from(array)

const array_clone = array.map(x => x)

 

JS/ES – Array.reduce

概要

Array.prototype.reduce()メソッドは、配列の要素を一つずつ取り出しながら畳み込み処理し、一つの値を返すメソッド。

要素の合計や最大値の取得といった基本的な処理もこのメソッドで実装する。

書式

reduce()メソッドは引数にコールバック関数をとる。

[配列].reduce(callback[, initial_value]);

コールバック関数がとるべき引数は決まっている。

callback(accumulator, current_value[, index[, array]]) 

処理の概要

initial_valueが指定されない場合、以下のように処理される。

  1. 配列の最初の要素の値がaccumulatorにセットされる
    1. 要素数が1の場合には、そのまま終了
    2. 要素数が2の場合には、2番目の要素の値がcurrent_valueにセットされる
  2. 最後の要素に達するまで、定義された関数の処理を行い、curren_valueを次の要素の値とする

initial_valueが指定された場合は、accumulatorの初期値としてinitial_valueが使われ、最初のcurrent_valueには1つ目の要素の値がセットされる。通常、initial_valueを指定しておく方が安全。

畳み込みの途中結果はaccumulatorに保存されていくが、戻り値は処理内容に応じてユーザーが定義する。

基本的な例

要素の合計

以下の例では、配列の要素の合計値を求めている。

関数定義では、各要素をスキャンするごとにその値をaccumulatorに足しこんでいる。その結果、最後の要素に達した時にaccumulatorの値は要素の合計値となっている。

要素の最大値

以下の例では、配列の要素の最大値を求めている。

accumulatorの値は要素をスキャンするごとにより大きい値へと書き換えられ、実行終了時には要素のうち最大の値となっている。

処理過程の確認

reduce()のイテレーション各回でaccumulatorやcurrent_valueがどのように推移するか確認してみた。

コールバック関数の戻り値がないため、2回目以降のイテレーションでaccumulatorの内容がundefinedになっている。逆に言えば、reduceのイテレーションごとにコールバックの戻り値をaccumulaterに渡している。

イテレーションの最後でcurrent_valueの値がundefinednullemptyなどのいずれでもない理由は不明。

initial_valueの指定の有無によって、accumulator、current_valueの各回の値やイテレーション回数が異なっている点に注意。

 

JS/ES – アロー関数

概要

アロー関数/アロー関数式は、function定義の短縮構文。

基本形

function'=>'

'function(引数)''(引数) =>'の形にするのが基本形。

1行表記の簡略化

さらに以下のように簡略化できる。

  • {}で囲んで1行表記
  • 処理内容が1行の場合は{}が不要
  • 引数が1つの場合は引数の()も不要

ただし引数がないときは()が必要。