reduceを使用して、アイテムが配列内にある回数を検索します。 配列は再帰的に配列を持つことができます。reduceを使用して配列を短くする
var foo = [
1,
[2, 3, 4],
4, [5,6,7], 4
];
bar(foo, 4)
は3
reduceを使用して、アイテムが配列内にある回数を検索します。 配列は再帰的に配列を持つことができます。reduceを使用して配列を短くする
var foo = [
1,
[2, 3, 4],
4, [5,6,7], 4
];
bar(foo, 4)
は3
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つの数値に減らします。この関数はすべての内部配列に対しても呼び出され、配列以外の項目については、それらが目的の項目と等しくなるようにチェックされます。
最初のリターンの第2パラメータは何ですか? 、0)。 – NorCalKnockOut
ああ。驚くばかり。これは本当にきれいです。ありがとう – NorCalKnockOut
@NorCalKnockOut最初に 's'は初期値(0)に初期化され、すべての要素の関数を呼び出して戻り値を' s'に再度格納し、次の要素で関数を呼び出します。それが 'reduce'の仕組みです。 –
を返しますあなたは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>');
OPは再帰関数を要求しています。 –
@ HiI'mFrogatto \tこれは 'count'の中から' count'を呼び出します。再帰的な定義ではありませんか? –
申し訳ありませんが、私はそれを見ていませんでした。 ':)' –
あなたが(そして、それはどのブラウザでも動作します)再帰をしたいのであれば:より非効率的になりますが、ここで
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"));
は、外部の状態を必要としない解釈の別の機能タイプです。 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>
あなたはこのコードの各要素の出現回数をカウントすることができます
_.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"));
このソルトイオンは再帰的ではありません。
あなたの例では 'bar(foo、" a ")'が '3'を返すのはなぜですか? – Codor
@NorCallKnockOut説明をありがとう。 – Codor
fooはオブジェクトではなく、配列である – edc65