我试图编写一个countBy函数,与Javascript中的countBy方法相同。以下是我到目前为止的情况:
var array = [1,2,4,4,5];
function countBy(collection, func) {
var object = {} ;
for (var i=0;i<=0; i++) {
for (var key in object) {
if (func(collection[i]) === object.key) {
object.key ++;
} else {
object.key = 1;
}
}
}
return object
}
alert(countBy(array, function(n) {return Math.floor(n);}));
代码打算做的是搜索集合数组以查看其中的值是否与对象中的键匹配。如果它在集合数组中找到匹配项,则将该键值增加1。如果尚未找到,则创建新的键值。因此,应该提醒的结果是:{4:2,1:1,2:1,5:1}。但似乎我的输出是[object Object]。我做错了什么?
答案 0 :(得分:0)
for (var i=0;i<=0; i++) {
这将只运行一次而不是遍历集合。
for (var key in object) {
if (func(collection[i]) === object.key) {
这是错误的;你应该在每次迭代中只调用func
一次,然后在你的对象中查找函数调用的结果。
object.key ++;
这不能做你想做的事;最好使用数组解除引用运算符。
function countBy(collection, func)
{
var object = Object.create(null);
collection.forEach(function(item) {
var key = func(item);
if (key in object) {
++object[key];
} else {
object[key] = 1;
}
});
return object;
}