2016-08-07 12 views
1

と考えることができていない理由のために呼び出さ取得機能ではありません。のstartsWithが、私はこのコードを持って、私は

TypeError: r[e].startsWith is not a function at js-cf2cc68….min.js.gz:85 at fn (eval at compile (js-cf2cc68….min.js.gz:8), :4:1003) at js-cf2cc68….min.js.gz:7 at p.$digest (js-cf2cc68….min.js.gz:7) at p.$apply (js-cf2cc68….min.js.gz:7) at HTMLBodyElement. (js-cf2cc68….min.js.gz:9)

これが可能である方法:

for (var i = 0; i < value.length; i++) { 
    if (typeof value[i].keyword == 'undefined' || value[i].keyword == null || value[i].keyword.startsWith(keyword)) { 
     out.push(value[i]); 
    } 
} 

私はというエラーメッセージを取得していますか?私はすべてを占めていると思う。

+1

だろう '値である[i]の文字列を.keyword'? – Marty

+0

は、 'value [i] .keyword'が数値、ブール値、日付、オブジェクト、または文字列ではない他の数のものであることを意味します。 –

+0

[startsWith - Browser Support](https:// developer。 mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith#Browser_compatibility) – Thomas

答えて

4

値[i] .keyword.startsWith("キーワード")start withのパラメータは文字列である必要があるためです。 だから、このよう

for (var i = 0; i < value.length; i++) { 
    if (typeof value[i].keyword == String(undefined) || value[i].keyword.startsWith("keyword")) 
     out.push(value[i]); 
} 
+0

開始のパラメータは文字列でなければなりません...または文字列に変換できるものを含む変数?例えば ​​'String(undefined)'のような未定義です – Thomas

+0

はい、そうです。ヌル値のテストは無関係になるので、これ以上のことです。よくやった。私はちょうどこの方法で自分のコードを修正しました –

1

良く動作しますI [i]は.keywordが文字列である値を取ります。 String.prototype.startWithは古いブラウザではサポートされていません。 browser supportを参照してください。

古いブラウザで使用するには、既存のpolyfillsのいずれかを使用できます。関連項目How to check if a string “StartsWith” another string?

+0

私はまだ混乱しているので、最新のブラウザを使用しています。それがエラーではなく文字列であるかどうかを確認する方法はありますか? –

+0

私はchromeでデバッグしますが、console.log(typeof value [i]。キーワード);働くだろう –

2

Is there a way that I can check if it's a string rather than have it error out?

タイプを確認してください。

var out = values.filter(v => v.keyword == null || typeof v.keyword === "string" && v.keyword.startsWith(keyword)); 

または単にタイプ

var out = values.filter(v => v.keyword == null || String(v.keyword).startsWith(keyword)); 

か、desctructuringを使用している場合、あなたも、この使用することができます強制:私が代わりにアレイ・メソッドを使用することができreccomendだろう

var out = values.filter({keyword: v}) => v == null || String(v).startsWith(keyword)); 

を手作業でループを書くこと。

  • イモ。それはあなたの意図のより良い説明です(コードをスキャンするのに適しています)。

  • これはホット・パス(これは頻繁に呼ばれます)の場合、JSオプティマイザは知っていることを利用して、コードをフィルタリングし、最適化することができます。おそらく、ループ中に実行される配列の完全性チェックをスキップします。

    これがホット・パスでない場合、JSで関数を数回呼び出すことによるパフォーマンスの影響を測定することさえ困難です。文字列に変換するため

    実測
0

a useful article

このトピックについての3つのアプローチがある:

  1. value.toString()
  2. "" +値
  3. 文字列(値)

ここで注意すべきポイントは、値がnullまたは未定義の場合、アプローチ#1は機能しないということです。

私の場合は、何らかの理由でアプローチ#2はどちらか動作しませんでしたので、最良のオプションは、文字列(値)

var col = "rt_" + rows[i]["results"][r].ResultTypeID.substring(1); //did not work 

var col = "rt_" + String(rows[i]["results"][r].ResultTypeID).substring(1); 
関連する問題