"TypeError: obj.indexOf is not a function"エラーが出た時

Vue.jsでindexOfを使っていると

Vue.jsindexOfを使っていると割と頻繁に"TypeError: obj.indexOf is not a function"エラーに遭遇します。
大体の原因は、原因になっています。

indexOfは文字列にしか使えない

私がindexOfで上記のエラーに遭遇する時は、indexOfの参照元を数字にしてしまっている時です。
例えば以下の状況はエラーになります。

new Vue({
  el: '#app',
  data: {
    selectCategory: '1',
    items: [
      {category:1, name:'hoge'},
      {categoyr:2, name:'piyo'}
    ]
  },
  computed: {
    get: function(){
      var self = this;
      return this.items.filter(function (item) { 
        return item.category.indexOf(self.selectCategory) !== -1; 
      });
    }
  }
})

選択したカテゴリー(selectCategory)でフィルターをかける時に、参照に配列(items)のオブジェクトプロパティのカテゴリー(category)を指定しています。
この時に、カテゴリーの型が数字になっているため、"TypeError: obj.indexOf is not a function"エラーが発生しています。

解決

毎回型とか気にするのが面倒ならば、つねに文字型に変換して参照すれば良いと思います。
下記はその例

String(item.category).indexOf(self.selectCategory)

上記のエラーだったスクリプトを修正すると下記になります。

new Vue({
  el: '#app',
  data: {
    selectCategory: '1',
    items: [
      {category:1, name:'hoge'},
      {categoyr:2, name:'piyo'}
    ]
  },
  computed: {
    get: function(){
      var self = this;
      return this.items.filter(function (item) { 
        return String(item.category).indexOf(self.selectCategory) !== -1; 
      });
    }
  }
})

まとめ

割と頻繁に引っかかるので、忘れなように備忘日記でした。
当方ぺちぱーにて、型のこととか時々忘れそうになります。

今日はこの辺でー

  • この記事を書いた人

カバノキ

印刷会社のWEB部隊に所属してます。 WEB制作に携わってから、もう時期10年になります。 普段の業務では、PHPをメインにサーバーサイドの言語を扱っています。 最近のお気に入りはJavascriptです。 Vue.jsを狂喜乱舞しながら、社内に布教中です。

-vue.js
-, ,