TypeError: Cannot read property 'C' of undefined
何故そんな怒られ方をするのか知らなきゃわからない奴ですね。
これから先、JavaScript・Node.jsを触る上で一生付きまとう問題なので、ちゃんと理屈から解説していきます。
JSはオブジェクト指向プログラミング言語なので、
オブジェクト、インスタンス、プロパティ、メソッド等の概念が存在します。
下記はどんな値でもオブジェクトだからプロパティやメソッドを所持してるんだよっていう説明の為のコードです。
js
1const str = "111,222,333";
2console.log(str.split(","));
3// ["111", "222", "333"]
"111,222,333"
はプリミティブに属するString型ではあるんですがオブジェクトとしての性質も所持しています。
なので何も指定してなくてもStringってだけでsplit
というメソッドを所持しているんですね。
参考記事: String.prototype.split - MDN
値.プロパティ名
という風に.
(ドット)を使うと、その値のプロパティへアクセスが可能ですが、
JSにはプロパティを所持してはならない例外中の例外が2つだけ存在します。
これらの要素に対してはプロパティアクセスを試みる事も禁止!
プロパティアクセスを試みた瞬間エラーで落ちてしまいます。
さて、この前提を元に問題のエラーコードを読んでいきましょう。
TypeError: Cannot read property 'C' of undefined
意訳: undefined値はプロパティを所持出来ないにも関わらず、Cプロパティを探そうとしていますね?
一見Cプロパティにアクセスしようとしている箇所を探せば良さそうですが違います。
Cプロパティにアクセスする元の「値」がUndefined
値になっているのが問題なんです。
普通は値がUndefinedにならないよう上流の工程で不正な値を除外する等をしておくべきですが、
今回はその上流がOCRという不便な代物ですし、その次の行にやるべきことが書いてありますからね。
そちらを考えていきたいです。
ある条件に該当する行があればその行を無視する(存在がなかったことにしたい)という処理を書きたいです。
その行が存在しなければ、行の情報全体がUndefinedになってしまうんですね。
ならばプロパティにアクセスする前にせき止めてしまいましょう。
js
1const targets = [
2 {name: "taro", age: 18},
3 null, // このままループするとエラーになってしまう!
4 {name: "jiro", age: 17},
5];
6for (const target of targets) {
7 // こういう風に値をチェックしてreturnやcontinueで逃げる事をガード節と呼ぶ
8 if (target == null) {
9 continue;
10 }
11 console.log(target.name);
12}
コードに関して解説
等価演算子==は右辺や左辺が○○ならばこういう動作をしなさいということが明確に定義されています。
例えば値 == null
とした場合は、値がnullとundefinedの2つの値のどちらかであればtrue
になり、それ以外は全てfalse
です。
仮に""
や0
といったfalse
っぽい値が入ってきても等しくfalse
となります。
これでプロパティを所持していない空のデータを排除できるわけです。
continueはそのループをスキップする処理です。
今回のようなケースにはうってつけでしょう。