【JavaScript】forEachで注意すること

forEachは配列の値がundefinedになっていたら、スルーされる挙動をするみたいだな。
それから、空の配列に対してforEachを使用してもエラーにはならない。



const array1 = [];

array1[1] = 90;
array1[5] = 190;

console.log("array1");

for (let i = 0; i < array1.length; i += 1) {
    console.log("array1[" + i + "] = " + array1[i]);
}

console.log("---------");

array1.forEach((element, i) => {
    console.log("array1[" + i + "] = " + element);
});

const array2 = [];

array2.forEach((element, i) => {
    console.log("array2[" + i + "] = " + element);
});

/*

array1
array1[0] = undefined
array1[1] = 90
array1[2] = undefined
array1[3] = undefined
array1[4] = undefined
array1[5] = 190
---------
array1[1] = 90
array1[5] = 190

*/

続きを読む

【JavaScript】Math.maxとMath.minとfilterメソッド

配列の中の最大値と最小値をMath.maxとMath.minで求めようとしたところ、配列の値にundefinedが含まれているとNaNが返ってくることに注意する。
このため、filter(Boolean)あるいはfilter(value => value)を使ってfalsyな値(false とみなされる値)を全て削除した後にMath.maxとMath.minを使うこと。
falsyな値は次の通りである。
null
undefided
空文字
数値の0
NaN

空の配列に対してMath.maxを使うと-Infinityが返ることに注意する。
空の配列に対してMath.minを使うとInfinityが返ることに注意する。

続きを読む

【JavaScript】for文をfindメソッドで書き換える

for文で書くと長くなるコードをfindメソッドを使うと簡潔に書ける。



const array1 = [5, 12, 8, 130, 44, 1000];

let result = "";

for (let i = 0; i < array1.length; i++) {
    if (array1[i] > 10) {
        result = array1[i];
        break;
    }
}

console.log("result = " + result);

const result2 = array1.find(element => element > 10);

console.log("result2 = " + result2);

/*

result = 12
result2 = 12

*/

続きを読む

【JavaScript】forEachメソッドをfilterメソッドで書き換える

forEachメソッドで書くと長くなるコードをfilterメソッドを使うと簡潔に書ける。



const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];

const result = [];

words.forEach((element, i2) => {

    if (element.length > 6) {
        result.push(element);
    }

});

console.log("result = " + result);

const result2 = words.filter(word => word.length > 6);

console.log("result2 = " + result2);

/*

result = exuberant,destruction,present
result2 = exuberant,destruction,present

*/

続きを読む

【JavaScript】文字列を逆にする

文字列「Hello」を文字列「olleH」にするstrrev関数を作る。
splitメソッド、reverse()メソッド、joinメソッドを使えば実現できる。



    //文字列を逆さ読みする
    let strrev = function(string) {
        //文字列に変換する
        string = string.toString();
        //splitメソッドで文字列を複数の文字列に分解し、それらを含む配列を生成する
        //reverseメソッドで配列の要素を逆にする
        //joinメソッドで配列から文字列を生成する
        return string.split('').reverse().join('');
    };

    console.log("Hello");
    console.log(strrev("Hello"));

/*
Hello
olleH
*/

続きを読む

【JavaScript】数値か判定するisNumber関数

入力した値が数値か数値以外かを判定するためにisNumber関数を使う。
typeof演算子を使ってnumberなら数値と判定できる。しかし、Infinityと-Infinityはtypeof演算子を使うとnumberと判定されてしまう。isNumber関数ではInfinityと-Infinityをfalseと判定する。
このため、Infinityと-Infinityを数値と判断したくない場合はisNumber関数を使う。

空文字、Infinity、-Infinity、文字列0、nullの場合、isNumber関数はfalseになる。
数値0の場合、isNumber関数はtrueになる。

続きを読む

【JavaScript】$.when()の使い方

$.when()メソッドは複数のオブジェクトを渡して並列で読み込んだ後に成功するとdoneメソッドを実行する。$.when()メソッドは非同期処理である。

これはどういうことかと言うと、
処理A
$.when(オブジェクト1、オブジェクト2).done(function() {});
処理B
の場合を考える。
処理Aを実行後に、$.whenメソッドはオブジェクト1とオブジェクト2の読み込みに成功するとdoneメソッドを実行する。$.whenメソッドは非同期処理であるため、オブジェクトの読み込みが早く終わる場合は、処理A→$.when()でオブジェクトを読み込む→$.when()のdone()を実行→処理Bを実行。
オブジェクトの読み込みに時間がかかってしまう場合は、処理A→$.when()でオブジェクトを読み込む→処理B→$.when()のdone()を実行。
$.when()メソッドは非同期処理なので、doneメソッドの実行が終わるまで待たずに次の処理を実行する

続きを読む

【JavaScript】forEachとarguments

配列はforEach文が使用可能である。
しかし、配列ではなくオブジェクトの場合、forEach文は使用不可能である。
こんな時は、object.key()を使ってオブジェクトのキー(プロパティ名)の配列を通常のループで取得するのと同じ順序で得ることができる。
つまりobject.key().forEach()とする。

すべての関数は実行されるときにthisとargumentsを受け取る。
argumentsはlengthプロパティが存在するためオブジェクトと思いきや、argumentsは配列に似たオブジェクトである。このためargumentsにはforEach文が使用不可能である。

配列の要素を取り出すfor文をforEach文に書き換えをしていると、argumentsの値を取り出すfor文をforEach文に書き換えができなかった。
調べると、argumentsはオブジェクトでありforEach文を使用不可能だった。

「argumentsの値を取り出す」の言い方は正しいのか?よく分からん。

続きを読む

【JavaScript】Array.prototype.concatメソッドとArray.prototype.reduce()メソッド

concatメソッドは、自分自身の配列と引数として渡された要素を連結して、新しいコピー配列を生成する。もし引数として渡された要素が配列なら、そこに含まれる要素がそれぞれ新しく作られた配列に追加される。
concatメソッドとスプレット構文(Spread syntax)とreduceメソッドを使うと2次元配列を1次元配列に変換できる。
簡単に2次元配列を1次元配列に変換可能なことに驚いたわ。

concatenate (他)《コ》[文字などを]連結させる
concatenation (名)(U)連続,連結
spread (自)広がる (他)を広げる

続きを読む