2016-06-30 5 views
1

私はd3が初めてで、ソースコードを読んで習得しようとしています。おそらく最も単純な関数d3.min()から始めます。しかし、私の髪は、一見非常に共通のコードf(array[i], i, array)によって引き裂かれました。`d3.min()`ソースコードにある `f(array [i]、i、array)`の意味を理解するには?

  1. 私はf()が関数であると考えています。
  2. array[i]は、インデックスiarrayの要素にアクセスしています。
  3. iは、arrayのインデックスです。
  4. arrayは、ユーザーが指定した数字の配列です。

上記4人の理解が正しい場合、次にf()ユーザによって与えられる機能として、その引数としてarray[i]のすべての3つ、iarrayを有していなければなりません。しかし、これらの議論のすべてを使う必要はありませんか?

f()のポイントは何ですか?誰でも有用な例/用途を提供することができますd3.min(array, f)fnullではありませんか?

+3

ながらアレイの最小値を求める関数HTTPS ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach –

+0

ありがとう@NiettheDarkAbsol、このリンクは非常に役に立ちます。 – Daniel

+1

はい、あなたのポイントは正しいです。そして、あなたはすべての議論を通過する必要はありません。しかし、2つだけを渡すと、最初の2つの引数には、他の引数とは異なる場所が設定されます。しかし、引数f(val、val、null、val)を渡すと、これまでどんな引数を渡すことができるでしょうか。私たちはfが何であるか分からないので、fの全体の点はここでは知ることができませんが、基本的にそれに渡された引数を使用する関数です – thatOneGuy

答えて

1

ここで少し混乱があります。まず、d3.mind3.maxは、アクセサの有無にかかわらず使用できます。 APIで:

d3.min(配列[、アクセッサ])

カンマの前に、この角括弧は、それが強制オプションではないことを意味します。だから、あなたは簡単なを持つことができます。

var something = d3.max(someArray); 

または、アクセサ(アクセサがnullないたとえば、あなたが尋ねたように)使用して:

var something = d3.max(data, function(d) { 
    return d.foo 
}); 

を今、私たちは、あなたの質問に来る:あなたを上記のコードではアクセサ関数に引数が1つしかないことがわかります。

あなたが提供した例は、D3がアクセサ機能を処理するために使用するソースコードです。コードを見ると、array[i],iarrayが表示されます。これらの3つの引数はユーザによって提供されず、D3ソースコードによってアクセサ関数に渡されます。

JSでは、パラメータよりも引数を多く、または引数よりも少ない引数を渡すことができます。

+2

実際には、アクセサー関数は、現在の要素、インデックス、および配列自体である最大3つの引数を持つことができます。これは、ソーススニペットが行うことです:アクセッサ 'f'を現在の要素' array [i] 'でインデックス' i'で呼び出し、 'array'自体を提供します。しかし、あなたはそれに応じてパラメータを指定することによって、あなたがそれを作ることはあなた次第です。 @ケニー – altocumulus

+0

ありがとう、altocumulus。私はこれらの引数がソースコード自体によってアクセサに渡されることを明確にするために小規模版を作った。 –

+1

さらに具体的には、 'd3.max(data、function(current、index、array){。。 – altocumulus

0

fはコールバック関数です。 JavaScriptでは常にコールバックを使用しています。したがって、この関数は、mapまたはforEachメソッドが標準配列に対して行うのと同じ方法で動作します。また、value、index、arrayの呼び出しシグネチャも同じです。

d3.min([1,2,3], (v,i,arr)=>10-v) // 7 
d3.min([1,2,3]) //1 

我々は答え上記のように「コールバック」と分関数はその配列内の3番目の項目であるが、7のように答えを与えるコール(10ため - 3 7)

+0

' d3.array.min'は 'Uncaught TypeError'を使用するように2番目のスニペットを変更することができます'代わりに「d3.min'」と答えてください。 –

-1

添加fこの最小値は>= 6

 \t var array = [10, 2, 3, 4, 5]; 
 
     // find the minimum while >= 6 
 
     var f = function(x, y, z) { 
 
      if (x >= 6) { 
 
       return x; 
 
      } 
 
     } 
 
     var min = d3.min(array, f); 
 
     
 
     console.log(min);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

+0

これはどのようにして質問への答えですか?これはたいていのフォローアップです。 – altocumulus

+0

ありがとう@altocumulus、すべての質問は上記の答えでうまく答えられました、ここでは、例を求めたことを考えると、 'd3.array.min'で意味のある条件を提供する別の' f'関数の例を共有したいだけです。 。 – Daniel

関連する問題