2013-02-20 219 views
0

由於某些原因,此JavaScript似乎無法正確計算,並且一直給我某些數組值的無窮大。將錯誤值分配給變量

var stock = { 
     "data": { 
      "portfolio": [ 
       [1298641715000, 1631.00], 
       [1298656616000, 1311.00], 
       [1299606578000, 1311.00], 
       [1300381305000, 820.50], 
       [1300813418000, 2074.80], 
       [1300970915000, 3862.50], 
       [1300985378000, 4597.35], 
       [1301071778000, 3554.85], 
       [1301505492000, 5653.05], 
       [1302195878000, 4871.80], 
       [1302368766000, 4079.80], 
       [1306343616000, 5062.60], 
       [1307036495000, 5062.60], 
       [1307726770000, 7207.60], 
       [1307727695000, 6372.60], 
       [1312998095000, 5816.10], 
       [1313430095000, 5816.10], 
       [1316625492000, 7816.10], 
       [1316711892000, 6566.10], 
       [1316713295000, 7777.10], 
       [1316713295000, 8921.60], 
       [1316799695000, 10902.10], 
       [1316886095000, 8627.10], 
       [1318094770000, 7717.10], 
       [1318267163000, 6807.10], 
       [1326306370000, 8228.30], 
       [1327429500000, 9228.30], 
       [1328208664000, 10222.05], 
       [1329503831000, 10188.65], 
       [1330368095000, 11274.15], 
       [1330541464000, 12006.75], 
       [1330714264000, 13222.25], 
       [1331059408000, 14029.75], 
       [1331144806000, 15676.55], 
       [1333648264000, 17256.02], 
       [1334080424000, 18701.62], 
       [1336672860000, 19745.42], 
       [1336758824000, 20018.77], 
       [1336773969000, 21130.77], 
       [1337015320000, 20312.47], 
       [1337277827000, 21650.02], 
       [1339002758000, 22285.97], 
       [1341934145000, 23972.67], 
       [1341934243000, 24182.67], 
       [1342103859000, 25830.67], 
       [1342475250000, 25380.67], 
       [1342654950000, 25669.09], 
       [1343147542000, 25797.43], 
       [1343412475000, 25994.43], 
       [1343658668000, 26203.43], 
       [1343804523000, 26342.43], 
       [1343840755000, 26432.43], 
       [1343922704000, 25914.43], 
       [1343922759000, 26031.43], 
       [1345053816000, 26156.43], 
       [1345138832000, 26253.43], 
       [1345576479000, 26483.43], 
       [1345576537000, 26588.43], 
       [1345656708000, 26628.43], 
       [1346442006000, 26704.43], 
       [1346953652000, 26456.43], 
       [1347553896000, 26586.43], 
       [1347554286000, 26865.43], 
       [1347559351000, 27062.43], 
       [1347560040000, 27533.43], 
       [1347560369000, 27351.43], 
       [1347641968000, 26577.43], 
       [1348063653000, 26860.43], 
       [1348591198000, 26588.43], 
       [1348591500000, 26598.43], 
       [1348668767000, 26728.43], 
       [1348681823000, 27094.43], 
       [1349367062000, 27254.43], 
       [1349368159000, 27379.43], 
       [1350310748000, 27675.43], 
       [1350503445000, 27858.43], 
       [1350923279000, 27979.43], 
       [1352131960000, 27742.43], 
       [1353522221000, 27997.43], 
       [1353685832000, 28299.43], 
       [1355157961000, 28545.43], 
       [1355766797000, 28692.43], 
       [1355947837000, 28913.43], 
       [1357671266000, 29304.43], 
       [1357672054000, 29531.44], 
       [1358448645000, 28856.44], 
       [1358448738000, 29036.44], 
       [1358455579000, 29236.44], 
       [1358540610000, 29430.44], 
       [1360095697000, 30077.44], 
       [1360596277000, 30154.44], 
       [1360612771000, 30651.44], 
       [1360860220000, 30789.44], 
       [1360869993000, 31389.44] 
      ], 
       "portfolio2": [ 
       [1298641715000, 1631.00], 
       [1298656616000, 1311.00], 
       [1299606578000, 1311.00], 
       [1300381305000, 820.50], 
       [1300813418000, 2074.80], 
       [1300970915000, 3862.50], 
       [1300985378000, 4597.35], 
       [1301071778000, 3554.85], 
       [1301505492000, 5653.05], 
       [1302195878000, 4871.80], 
       [1302368766000, 4079.80], 
       [1306343616000, 5062.60], 
       [1307036495000, 5062.60], 
       [1307726770000, 7207.60], 
       [1307727695000, 6372.60], 
       [1312998095000, 5816.10], 
       [1313430095000, 5816.10], 
       [1316625492000, 7816.10], 
       [1316711892000, 6566.10], 
       [1316713295000, 7777.10], 
       [1316713295000, 8921.60], 
       [1316799695000, 10902.10], 
       [1316886095000, 8627.10], 
       [1318094770000, 7717.10], 
       [1318267163000, 6807.10], 
       [1326306370000, 8228.30], 
       [1327429500000, 9228.30], 
       [1328208664000, 10222.05], 
       [1329503831000, 10188.65], 
       [1330368095000, 11274.15], 
       [1330541464000, 12006.75], 
       [1330714264000, 13222.25], 
       [1331059408000, 14029.75], 
       [1331144806000, 15676.55], 
       [1333648264000, 17256.02], 
       [1334080424000, 18701.62], 
       [1336672860000, 19745.42], 
       [1336758824000, 20018.77], 
       [1336773969000, 21130.77], 
       [1337015320000, 20312.47], 
       [1337277827000, 21650.02], 
       [1339002758000, 22285.97], 
       [1341934145000, 23972.67], 
       [1341934243000, 24182.67], 
       [1342103859000, 25830.67], 
       [1342475250000, 25380.67], 
       [1342654950000, 25669.09], 
       [1343147542000, 25797.43], 
       [1343412475000, 25994.43], 
       [1343658668000, 26203.43], 
       [1343804523000, 26342.43], 
       [1343840755000, 26432.43], 
       [1343922704000, 25914.43], 
       [1343922759000, 26031.43], 
       [1345053816000, 26156.43], 
       [1345138832000, 26253.43], 
       [1345576479000, 26483.43], 
       [1345576537000, 26588.43], 
       [1345656708000, 26628.43], 
       [1346442006000, 26704.43], 
       [1346953652000, 26456.43], 
       [1347553896000, 26586.43], 
       [1347554286000, 26865.43], 
       [1347559351000, 27062.43], 
       [1347560040000, 27533.43], 
       [1347560369000, 27351.43], 
       [1347641968000, 26577.43], 
       [1348063653000, 26860.43], 
       [1348591198000, 26588.43], 
       [1348591500000, 26598.43], 
       [1348668767000, 26728.43], 
       [1348681823000, 27094.43], 
       [1349367062000, 27254.43], 
       [1349368159000, 27379.43], 
       [1350310748000, 27675.43], 
       [1350503445000, 27858.43], 
       [1350923279000, 27979.43], 
       [1352131960000, 27742.43], 
       [1353522221000, 27997.43], 
       [1353685832000, 28299.43], 
       [1355157961000, 28545.43], 
       [1355766797000, 28692.43], 
       [1355947837000, 28913.43], 
       [1357671266000, 29304.43], 
       [1357672054000, 29531.44], 
       [1358448645000, 28856.44], 
       [1358448738000, 29036.44], 
       [1358455579000, 29236.44], 
       [1358540610000, 29430.44], 
       [1360095697000, 30077.44], 
       [1360596277000, 30154.44], 
       [1360612771000, 30651.44], 
       [1360860220000, 30789.44], 
       [1360869993000, 31389.44] 
      ], 
       "standard": [] 
     } 
    }; 

    var stockbase = stock.data.portfolio; 
    var stock1 = stock.data.portfolio2; 

    for (i = 0; i < (stock.data.portfolio2.length); i++) { 
     stock.data.portfolio2[i][1] = stock.data.portfolio2[i][1] * Math.random(); 
    } 

    //var performance1 = stock.data.portfolio2; 

    var i = 0; 

    while(i<stockbase.length) 
    { 
      if (i == 0){ 
      stock1[i][0] = stockbase[i][0]; 
      stock1[i][1] = 0; 
     } else if (stockbase[i][1] > stockbase[(i - 1)][1]) { 
      stock1[i][0] = stockbase[i][0]; 
      stock1[i][1] = (stockbase[i][1])/(stockbase[(i - 1)][1]); 
      stock1[i][1] -= 1; 
      stock1[i][1] *= 100; 
     } else if (stockbase[i][1] < stockbase[(i - 1)][1]) { 
      stock1[i][0] = stockbase[i][0]; 
      stock1[i][1] = ((stockbase[i][1])/(stockbase[(i-1)][1])); 
      stock1[i][1] -= 1; 
      stock1[i][1] *= 100; 
     } else { 
      stock1[i][0] = stockbase[i][0]; 
      stock1[i][1] = 0; 
     } 
     i++; 
    } 

    //console.log(stockbase); 
    //console.log(stock1); 

    var stockbase = stock.data.portfolio2; 
    var stock2 = stock.data.portfolio; 

    i = 0; 

    while(i<stockbase.length) 
    { 
      if (i == 0){ 
      stock2[i][0] = stockbase[i][0]; 
      stock2[i][1] = 0; 
     } else if (stockbase[i][1] > stockbase[(i - 1)][1]) { 
      stock2[i][0] = stockbase[i][0]; 
      stock2[i][1] = (stockbase[i][1])/(stockbase[(i - 1)][1]); 
      stock2[i][1] -= 1; 
      stock2[i][1] *= 100; 
     } else if (stockbase[i][1] < stockbase[(i - 1)][1]) { 
      stock2[i][0] = stockbase[i][0]; 
      stock2[i][1] = ((stockbase[i][1])/(stockbase[(i-1)][1])); 
      stock2[i][1] -= 1; 
      stock2[i][1] *= 100; 
     } else { 
      stock2[i][0] = stockbase[i][0]; 
      stock2[i][1] = 0; 
     } 
     i++; 
    } 

    console.log(stockbase); 
    console.log(stockbase==stock.data.portfolio2); 

變量庫存1在循環後完美工作,沒有任何問題。有趣的部分是在第一個while循環之後,即使沒有對stock.data.portfolio2進行更改,stock.data.portfolio2也具有與stock1相同的數組值。

我很困惑我做錯了什麼。

+0

你的第一個'for'循環聲明'i'作爲一個全局變量,不是本地的環路在其他語言中。將'var i = 0'移到第一個循環的上方。 – 2013-02-20 17:08:24

+0

我剛剛嘗試過,它設置stock1相當於stock.data.portfolio2隨機化... – 2013-02-20 17:13:06

+0

@FactorMystic其實'i'不會更全球化,因爲在此codesnippet內用'var'聲明的任何變量。所有的聲明都被提到了代碼的開頭。 – Teemu 2013-02-20 17:19:52

回答

2

當執行以下操作:

var stock1 = stock.data.portfolio2;

你的陣列stock.data.portfolio2的參考分配stock1。這意味着所有對stock.data.portfolio2的更改也將在stock1中看到。由於stock.data.portfolio2是一個數組的數組,我建議建立一個函數來複制數據,你進入你的變量stock1

function copyPortfolio(arr) { 
    var s = []; 
    for(i = 0; i < (arr.length); i++) { s.push(arr[i].slice()); } 
    return s; 
} 

var stock1 = copyPortfolio(stock.data.portfolio2); 
+0

恐怕'slice'技巧只能用字面值數組成功,'portfolio2'是一個「2D」數組,並且在使用'slice()'時也會被引用複製。 – Teemu 2013-02-20 17:21:57

+0

啊。你是對的: - /無論如何,它指向他的問題。我猜我必須用真正的解決方案來更新我的答案。 – Danny 2013-02-20 17:24:43

+0

燁試過了,沒有工作:/ – 2013-02-20 17:30:03