重置可重用函数的变量

时间:2016-11-22 20:11:11

标签: javascript jquery function scope return

我有一些代码可以计算返回的json中有多少个对象,并给出了总数。

loadCountSetOne = 0;
$.each(dataSetOne.user.customers, function(key, val) {  
    loads =  Object.keys(val.loads).length;
    loadCountSetOne = loadCountSetOne + loads;
    console.log(loadCountSetOne);
});

这很好用,但是因为我需要计算这些次数,所以我认为我会将它移动到它自己的函数中并在我需要它时调用它counter(val.loads);

count = 0;  
function counter(itemToCount) {
    result =  Object.keys(itemToCount).length;
    count = count + result;
    console.log(itemToCount, result, count);
    return count;
}

当我第一次调用该函数时,我得到了正确的结果。当我再次调用它时,它将第二个结果添加到第一个,依此类推。

我的理解是,这应该是它应该做的,但不是我需要做的。我尝试重置count的值是不同的地方,但它不起作用。

有没有办法让这个函数在每次调用时根据itemToCount中的对象数给我一个结果?

感谢。

1 个答案:

答案 0 :(得分:1)

您无法在counter()函数本身中执行此操作,因为它无法区分第一个调用(应该重置变量)与后续调用。您可以传递数组索引,它可以在索引为0时重置总数,但这不是一个很好的通用解决方案,因为您可能希望以其他方式使用该函数。

您只需要在$.each()循环之前重置变量:

count = 0;
$.each(dataSetOne.user.customers, function(key, val) {
    counter(val.loads);
});

或者你可以使用reduce,它是为积累价值而设计的。

function counter(total, itemToCount) {
    var result =  Object.keys(itemToCount).length;
    total += result;
    console.log(itemToCount, result, total);
    return total;
}

var count = dataSetOne.user.customers.reduce(function(total, current) {
    return counter(total, current.loads);
}, 0);