2015-12-30 5 views
5

reduceを使用して、アイテムが配列内にある回数を検索します。 配列は再帰的に配列を持つことができます。reduceを使用して配列を短くする

var foo = [ 
    1, 
    [2, 3, 4], 
    4, [5,6,7], 4 
]; 

bar(foo, 4)は3

+2

あなたの例では 'bar(foo、" a ")'が '3'を返すのはなぜですか? – Codor

+0

@NorCallKnockOut説明をありがとう。 – Codor

+0

fooはオブジェクトではなく、配列である – edc65

答えて

4

Array.prototype.reduceを使用して、このいずれかを試してみてください。

var foo = [1, [2, 3, 4], 4, [5, 6, 7], 4]; 
 

 
function f(arr, item) { 
 
    return arr.reduce(function (s, i) { 
 
    if (Array.isArray(i)) return s+f(i, item); 
 
    return s+(i==item?1:0); 
 
    }, 0); 
 
} 
 

 
console.log(f(foo, 4))

機能fは再帰関数です。すべてのアイテムをループし、1つの数値に減らします。この関数はすべての内部配列に対しても呼び出され、配列以外の項目については、それらが目的の項目と等しくなるようにチェックされます。

+0

最初のリターンの第2パラメータは何ですか? 、0)。 – NorCalKnockOut

+1

ああ。驚くばかり。これは本当にきれいです。ありがとう – NorCalKnockOut

+0

@NorCalKnockOut最初に 's'は初期値(0)に初期化され、すべての要素の関数を呼び出して戻り値を' s'に再度格納し、次の要素で関数を呼び出します。それが 'reduce'の仕組みです。 –

4

を返しますあなたはArray.prototype.forEach()

で1回のコールですべての項目を数えることができるforEach()方法は、一度配列要素ごとに用意された機能を実行します。

要素が配列であるかどうかをチェックすると、配列をパラメータとして関数が再度呼び出されます。

var foo = ["a", ["b", "c", "d"], "a"], 
 
    object = {}; 
 

 
function count(a, o) { 
 
    a.forEach(function (b) { 
 
     if (Array.isArray(b)) { 
 
      count(b, o); 
 
     } else { 
 
      o[b] = (o[b] || 0) + 1; 
 
     } 
 
    }) 
 
} 
 

 
count(foo, object); 
 
document.write('<pre>' + JSON.stringify(object, 0, 4) + '</pre>');

+0

OPは再帰関数を要求しています。 –

+4

@ HiI'mFrogatto \tこれは 'count'の中から' count'を呼び出します。再帰的な定義ではありませんか? –

+0

申し訳ありませんが、私はそれを見ていませんでした。 ':)' –

2

あなたが(そして、それはどのブラウザでも動作します)再帰をしたいのであれば:より非効率的になりますが、ここで

var foo = [ 
    "a", 
    ["b", "c", "d"], 
    "a" 
]; 

function bar(arr, item) { 
    var count = 0; 
    if (arr.length == 0) { 
     return 0; 
    } 

    for (var i = 0, l = arr.length; i < l; i++) { 
     var v = arr[i]; 
     if (typeof v === "string") { 
      if (v === item) { 
       count++; 
      } 
     } else { 
      count = count + bar(v, item); 
     } 
    } 

    return count; 
} 

console.log(bar(foo, "a")); 
2

は、外部の状態を必要としない解釈の別の機能タイプです。 underscoreを使用して

var foo = [ 
 
    "a", 
 
    ["b", "c", "d"], 
 
    ["a", "b"], 
 
    "a" 
 
]; 
 

 
function flatten(arr){ 
 
    return arr.reduce(function(ret, curr){ 
 
    return ret.concat(Array.isArray(curr) ? flatten(curr) : [ curr ]); 
 
    }, []); 
 
} 
 

 
function filterBy(arr, val){ 
 
    return arr.filter(function(item){ 
 
    return item === val; 
 
    }) 
 
} 
 

 
console.log(flatten(foo)); 
 
console.log(filterBy(flatten(foo), 'a'));
<script src="http://codepen.io/synthet1c/pen/WrQapG.js"></script>

1

あなたはこのコードの各要素の出現回数をカウントすることができます

_.countBy(_.flatten(array), _.identity) 

だから、関数fooは次のように実装できます。

function bar(foo, element){ 
    return _.countBy(_.flatten(foo), _.identity)[element]; 
} 
var foo = ["a", ["b", "c", "d"], "a"] 
console.log(bar(foo, "a")); 

このソルトイオンは再帰的ではありません。

関連する問題