使用reduce查找项目在数组中的次数。 该数组可以递归地包含数组。
var foo = [
1,
[2, 3, 4],
4, [5,6,7], 4
];
bar(foo, 4)
将返回3.
答案 0 :(得分:4)
您可以使用Array.prototype.forEach()
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>');
答案 1 :(得分: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
是一个递归函数。我们遍历所有项目并将它们减少到一个数字。该函数也将在所有内部数组上调用,对于非数组项,我们只检查它们是否等于所需的项。
答案 2 :(得分:2)
所以,如果你想要一个递归(并且它可以在任何浏览器中工作):
array(
0 => array(
0 => 0,
),
1 => array(
0 => 1,
),
2 => array(
0 => 2,
)
)
答案 3 :(得分:2)
这是另一种不需要外部状态的功能类型的解释,但效率会更低。
[EnableCors(origins: "http://mywebclient.azurewebsites.net", headers: "*", methods: "*")]
public class MyController: ApiController
{
...
}
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') );
答案 4 :(得分:1)
使用underscore,您可以使用以下代码计算每个元素的出现次数:
_.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"));
虽然这个解决方案不是递归的,但我觉得值得一提。