2017-02-08 7 views
1

Javascriptがなどの.map、.filter、JavascriptをArray.findは()

これらは素晴らしい仕事関係なく、あなたの配列がスパースであるかどうのようないくつかの素晴らしい機能を持っているスパース配列に問題があります。配列内の項目ごとにコールバックを一度発生させます。優れた。

また、.findと.findIndex関数もありますが、これらは別の方法で動作します。それらは配列内のINDEXごとに述語を一度起動します。スパース配列で使用すると、これは完全に間違った動作になります。

たとえば、配列の範囲が1000 - 1100の場合、最終的に実際のデータに到達する前に、入力パラメータとして未定義に1000回実行されます。

私のような感じ... a)は、これらの機能のすべてがこれは同様の方法(.findと.findIndexが間違ってそれをやっている間、.MAPと.filterは、右のそれを持っている) b)の中で動作するはずですバグ、そして修正する必要があります

思考?

+1

これは間違いなくそれを議論する場所ではありません。 – Pbd

+0

'map'は未定義の値を使用していないため、それらをスキップします。しかし、 'find'と' findIndex'を使って配列内の未定義のインデックスを見つけることができますので、何もスキップしません! –

+0

'find'と' findIndex'は単純な関数です。あなたは2分で自分を作ることができます。 –

答えて

6

動作は仕様通りです。例えば、比較、現在の仕様のドラフトを見て:

  • 仕様は(ステップ8C)を処理前の値の存在をArray.prototype.filter()試験のため:

  • 反復中、k < len
    a。 Pkを! ToString(k)
    b。 kPresentは? HasProperty(O, Pk)
    c。 kPresentが真である場合、[...]
  • Array.prototype.find()は処理前の値の存在をテストしないための仕様:

    1. 反復中、k < len
      a。 Pkを! ToString(k)
      b。 kValueを? Get(O, Pk)
      c。 [...]

あなたが述べるように、行動は確かに異なっており、それは仕様によって異なるのです。

これまでの設計上の考慮事項については、この時点でしか推測できませんが、これがバグであると感じる場合は、hereというバグレポートを提出することができます。


更新

find()findIndex()方法のオリジナルの仕様案が実際に実装スキップ/アレイの穴のチェックを持っていなかったようです。これらの草案は会議の議事によれば、March 14th 2013 ECMA Technical Committee 39 meetingで提案されました。

2014年8月に、アレイの穴をスキップするのではなく、undefinedとして処理する必要があると主張して、bugが提起されました。

Array#findArray#findIndexundefinedとして穴を治療するため TC39の最近の動向との整合性のために、undefined ではなく、それらをスキップして穴を扱う必要があります。

問題が

[,,,].includes(undefined) 

はtrueまたはfalseを返す必要があるかどうかの問題を中心discussion about the proposed behavior for Array.prototype.includes()に下支えしているようです。

また、この説明では、[...] TC39の最近の傾向は、穴を未定義として扱うことでした。 find()findIndex()方法のチェック

孔はその後のECMAScript 6ドラフトrevision 27で除去しました。リンクされたリソースを通じて読む

、あなたはfind()findIndex()仕様からスキップ/穴のチェックを削除するに至ったものについて、より完全なビューを得ることができますが、一度に一般的なコンセンサスは「穴ように見えた:誰も望んでいませんそれら "

+1

私はOPが、仕様に従って実装されていることを提案していると思いますが、仕様は最初は異なっていたはずです。 – nnnnnn

+0

@nnnnnn私はこれを知っています。ここでは仕様に関連する部分は質問に記載されていないので参考にしてください。これに入った設計上の考慮事項についての情報を探し続ける。 –

+2

@nnnnnn私は自分の答えを更新しました。私は、現在指定されている動作がどのようになったかを示す十分なリソースを見つけることができたと思います。 –