Javascript数组迭代 - 内存问题

时间:2013-01-28 07:31:33

标签: javascript performance memory-leaks

我是JS函数和对象的新手 我试图迭代一个数组......这是我的示例代码,我试图获得具有输入值的硬币倍数

var flag=0;var chipval=0;var num=0;
var main = function(coins){
        var coinsarr = [1,5,10,25,50,100,500,501];var length=coinsarr.length
        var remval = coins;
        var coinskey = "";
        while(flag==0){
            for(i=0;i<length;i++){
                if(coinsarr[i]>remval){
                    chipval = coinsarr[i-1];
                    num = parseInt(remval/chipval);
                    if(remval%chipval==0){
                        flag = 1;
                        break;
                    }else{
                        remval=remval%chipval;
                        $flag = 0;
                        break;
                    }
                }
            }
            coinskey = coinskey+","+chipval+":"+num;
        }
        coinskey = coinskey.replace(/(^,)|(,$)/g, "")
        alert(coinskey);
    }

当我运行main(120)时,这将返回100:2,10:2(这不是200的100币和2的10币)

当我运行main(720)时,我发现了内存泄漏......这说明了#34;此页面上的脚本使用了太多内存&#34 ;; 任何人都可以告诉我,问题出在哪里或者这是正确的方法吗?

感谢您的时间和耐心......

2 个答案:

答案 0 :(得分:1)

如果传递给函数的值大于数组中的最大值,则会有无限循环,因为flag永远不会更改。

具体来说,这个if声明中的条件:

if(coinsarr[i]>remval){

...对于720(或超过501的任何其他数字)永远不会成立。

另外,$flag = 0不应该是flag = 0吗?就目前而言,您创建了一个永远不会被使用的全局变量$flag

答案 1 :(得分:1)

获得一定数量的硬币来构成一个值的稍微清洁的选项是构建一个包含值的对象。这样的事情可以解决问题:

function coins(value){
    var coinsarr = [1,5,10,25,50,100,500,501];
    var out = {};
    while(value > 0){
        var i = 0;
        while(coinsarr[i+1] <= value){
            i++; // Find the coin to add.
        }
        var coin = coinsarr[i];
        value -= coin;
        if(!out[coin]){
            out[coin] = 0;
        }
        out[coin]++;
    }
    return out;
}

coins(499);
// {        Returns:
//     1: 4
//     10: 2
//     25: 1
//     50: 1
//     100: 4
// }
coins(21359);
// {        Returns:
//     1: 2
//     5: 1
//     10: 1
//     100: 3
//     501: 42
// }

这样做的好处是,您可以比解析字符串更容易检索值:

var coinsObj = coins(499);
for(var key in coinsObj){
    console.log(coinsObj[key] + ' times coin "' + key + '"' );
}
// 4 times coin "1"
// 2 times coin "10"
// 1 times coin "25"
// 1 times coin "50"
// 4 times coin "100"

或者只是构建一个这样的字符串:

var coinsObj = coins(499);
var outString = ''
for(var key in coinsObj){
    outString += ',' + key + ':' + coinsObj[key];
}
outString = outString.substr(1); // Remove the leading comma.