2016-10-06 14 views
3

私はそれぞれのマップとマップにネイティブ関数があることを知っていますが、私たちは裏で何が起こっているのか教えています。 ..だからそれぞれとマップを使ってループを理解していない

var sampleInput = [ 
    [1, 3, 2], 
    [4, 23, 100], 
    [7, 6, 3, -2] 
]; 

function eachNew(coll, f) { 
    if (Array.isArray(coll)) { 
    for (var i = 0; i < coll.length; i++) { 
     f(coll[i], i); 
    } 
    } else { 
    for (var key in coll) { 
     f(coll[key], key); 
    } 
    } 
} 

function map(array, f) { 
    var acc = []; 
    eachNew(array, function(element, i) { 
    acc.push(f(element, i)); 
    }); 
    return acc; 
} 
function max(array) { 
    var largest = 0; 
    eachNew(array, function(m){ 
     if (largest < m) { 
      largest = m}; 
    }); 
    return largest; 
} 

これをチェックしてくださいだから私は、私がこれを書くのかわからないので、[3, 100, 7]

を各配列内の最大数の配列を出力する関数maximumsを、書きたいです。ここに私の推測です。

function maximum(array) { 
    var array = [];{ 
    return map(array, max(array)) 
    }; 
    return array.push(max); 
} 

それは非常に良い推測のようには見えませんが、私は試してきました! 助けてくれてありがとう。

+3

ヒント:関数の引数の予想される型に細心の注意を払ってください。また、ブラウザのコンソールには大きな手がかりとなるエラーが表示されるはずです – charlietfl

+0

誰かがこの質問に投票したのはなぜですか? –

答えて

3

あなたは実際にはちょうどそこにあります。ちょっと複雑になっています。覚えておいてください。mapはを2番目の引数として使用します。この関数は、最初の引数として渡された配列に適用されます。だから、あなたが開発した2つの成分を使うだけです。したがって、maximumはかなり簡単になる:

function maximum(array) { 
    return map(array, max); 
} 

var numbers = maximum(sampleInput); 

console.log(numbers); 

あなたは学校のためにこれをやっているように思え、そのコメントの中で、私はあなたが私たちになぜ上記の作品をお伝えしたいと思います。また、max(array)をmapの第2引数として渡そうとしたときに何が間違っていたのでしょうか。 ;)

1

まず、これらの機能が何をするかを判断します。

eachNew:オブジェクトと関数をとります。オブジェクトが配列の場合、各項目とインデックスを順番に渡す関数を呼び出します。オブジェクトが配列でない場合は、各値とキーを順番に渡して関数を呼び出します。 (これらは、同様のものですが、まったく同じではない。)

map:配列と機能を考えると、eachNewを使用して、各項目に機能fを呼び出して、新しいを構築するために返されたものを使用して新しい配列を作成しますアレイ。 fは各項目の変換で、mapは配列全体を変換します。

max:配列を指定すると、eachNewを使用して、配列の最大要素を決定して返します。

あなたの目標は、配列の配列の要素を数値の配列に変換する関数を書くことです。各数値は最大値です。変換関数(map)と最大関数(max)があります。

<transform>(<arrayOfArrays>, <functionThatTurnsAnArrayIntoAMaximum>) => <arrayOfMaximums> 
0

これをあなたのニーズに合わせることができます(私はデータ型チェックを行わなかったので、おそらくそれを追加したいと思うかもしれません)。私はコードにコメントをつけるので、それに従うことができます。あなたの問題に対する別のアプローチとして、私は完全な応答を与えたくありませんでした。

'use strict'; 

function map (array, f) { 
    for (let element_index = 0; element_index < array.length; element_index++) { 
    f(array[element_index]); 
    } 
} 

function maximum (arrays) { 
    let max_values = []; /* This will hold the max values */ 
    for (let array_index = 0; array_index < arrays.length; array_index++) { 
    const array = arrays[array_index]; /* This is the current array of values */ 
    /* 
    let's say for now, that the max value is the first element of the array. 
    (assuming it holds numbers, and at least one of them) 
    */ 
    let max_value_of_the_array = array[0]; 
    map(array, value => { 
     /* This function will be applied on each value of the array. 
     If the value is greater than the setted before, then change it. 
     If this condition is never met, then the max value is already setted. 
     */ 
     if (value > max_value_of_the_array) { 
     max_value_of_the_array = value; 
     } 
    }) 
    /* Push the max value in the max values array */ 
    max_values.push(max_value_of_the_array); 
    } 
    /* After all arrays of the array has been iterated, and all max values getted, 
    return the max_values array */ 
    return max_values; 
} 

const values = [ 
    [1, 5, 3], 
    [11, 15, 13], 
    [21, 25, 23] 
] 

console.log(maximum(values)); // [5, 15, 25] 

エスペロhaberte ayudado、abrazo!

関連する問題