長いタイトルですみません…。
現在開発中のシステムで導入している ESLint という検証ツールで、タイトルにあるエラーが発生したので、対処法をまとめ。
エラー文は「The body of a for-in should be wrapped in an if statement to filter unwanted properties from the prototype.」というもので、翻訳したところ「for-inの本体は、プロトタイプから不要なプロパティをフィルタリングするためにif文でラップする必要があります。」とのことでした。
…いまいち意味が分からない…。
今回参考にさせていただいた記事はこちら。
JSLintオプション考察「unfiltered for in」|もっこりJavaScript|ANALOGIC(アナロジック)
http://analogic.jp/jslint-options-forin/
上の記事によると、for-in
ループを使用したときに列挙されるプロパティには、実際のデータ以外にも、プロトタイプ連鎖から来たプロパティも含まれるとのことでした。
そのため、取得したデータがオブジェクト自身が持つプロパティなのか、プロトタイプ連鎖から来たプロパティなのかを判断する必要があります。
で、それは hasOwnProperty()
を使うことで判断できるとのこと。
使い方は下記のとおりです。
const list = ['A', 'B', 'C', 'D', 'E']; for (data in list) { if (list.hasOwnProperty(data)) { // 実行したい処理 } }
3行目で、データの判別を行っています。
こちらを追加したところ、エラーが解消され、問題なく実行できました。
以上、JavaScript の for-in
文で発生したエラーの対処方法でした。
なおこの後、実装しているコードでは for-in
よりも forEach
の方が向いているとわかり、上記は使用しないように修正しました…。
が、うっかりと再発させそうなエラーだったので、備忘録としてまとめました。
もし、同じことでお困りの方は参考にしていただければと思います。