2016-07-29 5 views
1

jsonオブジェクトの計算と平均結果の返却に問題があります。ループトラフjsonオブジェクトと戻り値の集計結果

これは私のJSONオブジェクト

var testJson = [{ 
       "1": "0.038728952407837", 
       "2": "0.034420967102051", 
       "3": "0.034113883972168", 
       "4": "0.033237934112549", 
       "5": "0.033545017242432", 
       "6": "0.033923149108887", 
       "7": "0.033990859985352", 
       "8": "0.033454895019531", 
       "9": "0.033518075942993", 
       "10": "0.033759117126465", 
       "11": "0.033965826034546", 
       "12": "0.03358006477356", 
       "13": "0.033926010131836", 
       "14": "0.033300876617432", 
       "15": "0.033140897750854", 
       "16": "0.033447027206421", 
       "17": "0.033830165863037", 
       "18": "0.033417940139771", 
       "19": "0.033578157424927", 
       "20": "0.032893180847168", 
      }] 

であり、これは私のコード

var arr = testJson[0]; 
var total = 0; 
for (var i = 0; i < arr.length; i++) { //loop through the array 
    total += arr[i]; //Do the math! 
} 
console.log(total) 

であり、この結果の出力はちょうどどこ私は、だから、文字列

0.0387289524078370.0344209671020510.0341138839721680.0332379341125490.0335450172424320.0339231491088870.0339908599853520.0334548950195310.0335180759429930.0337591171264650.0339658260345460.033580064773560.0339260101318360.0333008766174320.0331408977508540.0334470272064210.0338301658630370.0334179401397710.0335781574249270.0328931808471680.0339531898498540.0339729785919190.0338070392608640.0332689285278320.0333919525146480.033372879028320.0353031158447270.0355949401855470.0359919071197510.036854982376099 

を連結しています失敗した?

答えて

2

タイプをfloatに解析する必要があります。 jsonの変数はすべて文字列であるためです。したがって、機能を追加すると、文字列連結のように機能します。追加する前に浮動小数点数を解析します。 like 合計+ = parseFloat(arr [i]);
​​

+0

返された結果による_Updatedコードは0 –

+1

はこれのためのフィドルを作成できますか? – Manikandan

+0

https://jsfiddle.net/valor_/f36tvdre/1/ –

1

parseFloatを使用してください。

var arr = testJson[0]; 
var total = 0; 
for (var i = 0; i < arr.length; i++) { //loop through the array 
    **total += parseFloat(arr[i]); //Do the math!** 
} 
console.log(total) 
+0

または番号機能を使用しています。合計+ =数(arr [i]); – Sheetal

+1

または単に 'total + = + arr [i]'です。 – nicael

+0

理由はわかりませんが結果は0です –

3

これは型変換の問題です。 testJsonの値は文字列です。 string1 + string2はこれらの2つの文字列を連結し、新しい文字列になります。 parseFloat関数を使用してこの値をFloatとして解析する必要があります。

if(!Object.values){Object.values=obj=>Object.keys(obj).map(key=>obj[key])} 

var arr = Object.values(testJson[0]); 
var total = 0; 
for (var i = 0; i < arr.length; i++) { //loop through the array 
    total += parseFloat(arr[i]); //Do the math! 
} 
console.log(total) 

第2の代替手段;

if(!Object.values)Object.values=obj=>Object.keys(obj).map(key=>parseFloat(obj[key])) 
var total = 0; 
Object.values(testJson[0]).forEach(function(val){total += val}); 

Iが使用されているコード行、

if(!Object.values)Object.values=obj=>Object.keys(obj).map(key=>parseFloat(obj[key])) 

ポリフィルあります。

出典:フリー百科事典「ウィキペディア(Wikipedia) Web開発では、ポリフィルは、機能をサポートしていないWebブラウザの に機能を実装するコードです。ほとんどの場合、 のブラウザで、 (一部のブラウザでサポートされている)ブラウザ、 、または既存の ブラウザの提案された標準(いずれのブラウザでもサポートされていません)のHTML5 Web標準を実装するJavaScriptライブラリを指します。正式には、「polyfillはブラウザAPIのシムです」[1]

+0

理由はわかりませんが結果は0です –

+0

https://jsfiddle.net/valor_/f36tvdre/ 1/ –

+0

私は、問題は私たちがオブジェクトの長さを取得しようとしていることです。それは未定義を返します。 forEachメソッドを使用してオブジェクトを反復処理するか、このオブジェクトを値配列に変換できます。 that_ –

1
var key, total = 0; 
var testJson = [{ 
      "1": "0.038728952407837", 
      "2": "0.034420967102051", 
      "3": "0.034113883972168", 
      "4": "0.033237934112549", 
      "5": "0.033545017242432", 
      "6": "0.033923149108887", 
      "7": "0.033990859985352", 
      "8": "0.033454895019531", 
      "9": "0.033518075942993", 
      "10": "0.033759117126465", 
      "11": "0.033965826034546", 
      "12": "0.03358006477356", 
      "13": "0.033926010131836", 
      "14": "0.033300876617432", 
      "15": "0.033140897750854", 
      "16": "0.033447027206421", 
      "17": "0.033830165863037", 
      "18": "0.033417940139771", 
      "19": "0.033578157424927", 
      "20": "0.032893180847168", 
     }] 
(testJson || []).forEach(function(obj){ 
    for(key in obj){ 
     total += parseFloat(obj[key], 10); 
    } 
});