【问题标题】:Javascript Array Iterations - Memory IssuesJavascript 数组迭代 - 内存问题
【发布时间】:2013-01-28 07:31:32
【问题描述】:

我是 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(这与 2 的 100 个硬币和 2 的 10 个硬币无关)

当我运行 main(720) 时,我遇到了内存泄漏...显示“此页面上的脚本使用了太多内存”; 谁能告诉我,问题出在哪里,否则这是正确的方法吗??

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

【问题讨论】:

  • 小心,i 正在泄漏到全局范围。
  • $flag = 0; 中的 $ 应该存在吗?
  • 看看这段代码chipval = coinsarr[i-1]; for i=0
  • 我先用 PHP 编写了该代码,然后在 JS 中工作(这是一个拼写错误 Cerbrus)我删除了那个 $...我的逻辑有一些问题,我明白

标签: javascript performance memory-leaks


【解决方案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.

【讨论】:

  • Cerbrus,感谢您的解决方案...我已经解决了。与我的逻辑相比,你的逻辑很好……+100 欢呼
  • 没问题,很高兴能为您提供帮助!感谢您接受我的回答^_^
【解决方案2】:

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

具体来说,这个if语句中的条件:

if(coinsarr[i]>remval){

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

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

【讨论】:

  • 哦,不,你是对的......我认为我的愚蠢逻辑有问题,谢谢你睁开眼睛 nnnnnn
  • 不客气。抱歉,我没有提出具体的解决方案,但我对你想要实现的目标有点困惑 - 我希望这能让你重回正轨。
  • 该数组有不同类型的硬币(硬币值),我正在尝试获取硬币值及其倍数....我的意思是 120(100x2,10x2) 或 538(500x1,25x1, 10x1,1x3)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 2015-03-14
相关资源
最近更新 更多