2017-12-20 9 views
2

このコードは主に楽しいものです。基本的には、配列の最初の4つの値と配列のすべての値に与えられた数を乗じた数を入力することができます。それが実行された後、プログラムは別の関数を呼び出して中間の数値が奇数の配列になるか計算し、偶数の配列の2つの中間の数値の平均を求め、その値をユーザーに返します。これは、配列がユーザーの番号で乗算された後に配列に加えられる前に、配列に対してこれを行うことになっています。コードは、配列内で値の数が奇数である場合、元の配列と変更された配列で使用されたときに正常に実行されます。しかし、修正された配列が偶数の場合、問題に遭遇します。 2つの中間数値の平均を返すのではなく、何らかの理由で値のNaNを返します。これは、変更されたアレイ上でのみ発生し、なぜそれが不思議に思っていましたか?ここに私のコードの2つのコピーがあります。最初の配列は奇数で、2番目の配列は偶数です。どんな助けもありがとう。ありがとう!JavaScript配列の値にNaNの結果に変換する問題

<!DOCTYPE HTML> 
<html lang="en-us"> 
<head> 
<meta charset="utf-8"> 
<title>Add Middle Array</title> 

<script type="text/javascript"> 

function collectdata() { 

var list = [0, 0, 0, 0, 5]; 

list[0] = parseFloat(document.getElementById("pokemon").value); 
list[1] = parseFloat(document.getElementById("digimon").value); 
list[2] = parseFloat(document.getElementById("transformers").value); 
list[3] = parseFloat(document.getElementById("workers").value); 

var multiply = parseFloat(document.getElementById("multi").value); 

var outcome = multiplier(list, multiply); 

var spaceoutcome = outcome; 

for (i = 0; i < outcome.length; i++) { 

spaceoutcome[i] = " " + spaceoutcome[i]; 
} 

document.getElementById("output1").innerHTML = spaceoutcome; 

var sumofmiddle = sum(list); 

document.getElementById("output2").innerHTML = sumofmiddle; 

var sumofmodmid = sum(outcome); 


document.getElementById("output3").innerHTML = sumofmodmid; 

} 

function multiplier(L, M) { 

var money = []; 

for (i = 0; i < L.length; i++) { 

money[i] = (L[i] * M); 
} 

return money; 

} 

function sum(L){ 
var outcome = 0; 
if (L.length % 2 == 0) 
{ 
outcome = ((L[L.length/2] + L[((L.length/2) - 1)])/2); 
} 
else 
{ 
outcome = L[((L.length - 1)/2)]; 
} 

return outcome; 

} 

</script> 
</head> 

<body> 

Please enter in a list of four values to be muliplied with the final value always being 5. <br> 

<input type="text" id="pokemon"><br> 
<input type="text" id="digimon"><br> 
<input type="text" id="transformers"><br> 
<input type="text" id="workers"><br><br> 

Please enter the multiplier.<br><br> 

<input type="text" id="multi"><br><br> 

<button type="button" onclick="collectdata()">Click here to multiply values</button> 

<div id="output1"></div><br><br> 

Bonus! Here is the average of the middle numbers of the arrays!<br> 

<div id="output2"></div><br><br> 

Final Surprise! Here is the average of the multiplied modified numbers!<br> 

<div id="output3"></div> 

</body> 
</html> 

ここでは誤動作している偶数番号の配列です。

<!DOCTYPE HTML> 
<html lang="en-us"> 
<head> 
<meta charset="utf-8"> 
<title>Add Middle Array</title> 

<script type="text/javascript"> 

function collectdata() { 

var list = [0, 0, 0, 0, 5, 6]; 

list[0] = parseFloat(document.getElementById("pokemon").value); 
list[1] = parseFloat(document.getElementById("digimon").value); 
list[2] = parseFloat(document.getElementById("transformers").value); 
list[3] = parseFloat(document.getElementById("workers").value); 

var multiply = parseFloat(document.getElementById("multi").value); 

var outcome = multiplier(list, multiply); 

var spaceoutcome = outcome; 

for (i = 0; i < outcome.length; i++) { 

spaceoutcome[i] = " " + spaceoutcome[i]; 
} 

document.getElementById("output1").innerHTML = spaceoutcome; 

var sumofmiddle = sum(list); 

document.getElementById("output2").innerHTML = sumofmiddle; 

var sumofmodmid = sum(outcome); 


document.getElementById("output3").innerHTML = sumofmodmid; 

} 

function multiplier(L, M) { 

var money = []; 

for (i = 0; i < L.length; i++) { 

money[i] = (L[i] * M); 
} 

return money; 

} 

function sum(L){ 
var outcome = 0; 
if (L.length % 2 == 0) 
{ 
outcome = ((L[L.length/2] + L[((L.length/2) - 1)])/2); 
} 
else 
{ 
outcome = L[((L.length - 1)/2)]; 
} 

return outcome; 

} 

</script> 
</head> 

<body> 

Please enter in a list of four values to be muliplied with the final value always being 5. <br> 

<input type="text" id="pokemon"><br> 
<input type="text" id="digimon"><br> 
<input type="text" id="transformers"><br> 
<input type="text" id="workers"><br><br> 

Please enter the multiplier.<br><br> 

<input type="text" id="multi"><br><br> 

<button type="button" onclick="collectdata()">Click here to multiply values</button> 

<div id="output1"></div><br><br> 

Bonus! Here is the average of the middle numbers of the arrays!<br> 

<div id="output2"></div><br><br> 

Final Surprise! Here is the average of the multiplied modified numbers!<br> 

<div id="output3"></div> 

</body> 
</html> 

答えて

1

あなたのsum()関数は現在、数値ではなく文字列を評価しています。入力に応じて整数または浮動小数点数に変換します。あなたはspaceoutcomeoutcome配列に追加するスペースが変更されますので、var spaceoutcome = outcome.slice();を使用する必要が

function sum(L){ 
var outcome = 0; 
if (L.length % 2 == 0) { 
    console.log(L.length/2) 
    var a = L[L.length/2]; 
    var b = L[((L.length/2) - 1)]; 
    outcome = ((parseInt(a) + parseInt(b))/2); 
} else { 
    ... 
} 
return outcome; 
} 
+0

本当にありがとうございました!あなたの事例は多くの助けとなり、正しい答えに導かれました。代わりにparseFloatを使用することにしました。これは、プログラムがしばしば分数になるためです。私は助けに感謝します! –

1

:私は下のparseInt()を使用しました。インデックスにはMath.floor()も使用してください。

は、ここでは、いくつかの構文エラーを持っていたコード

<!DOCTYPE HTML> 
 
<html lang="en-us"> 
 
<head> 
 
<meta charset="utf-8"> 
 
<title>Add Middle Array</title> 
 

 
<script type="text/javascript"> 
 

 
function collectdata() { 
 

 
var list = [0, 0, 0, 0, 5, 6]; 
 

 
list[0] = parseFloat(document.getElementById("pokemon").value); 
 
list[1] = parseFloat(document.getElementById("digimon").value); 
 
list[2] = parseFloat(document.getElementById("transformers").value); 
 
list[3] = parseFloat(document.getElementById("workers").value); 
 

 
var multiply = parseFloat(document.getElementById("multi").value); 
 

 
var outcome = multiplier(list, multiply); 
 

 
var spaceoutcome = outcome.slice(); 
 

 
for (i = 0; i < outcome.length; i++) { 
 

 
spaceoutcome[i] = " " + spaceoutcome[i]; 
 
} 
 

 
document.getElementById("output1").innerHTML = spaceoutcome; 
 

 
var sumofmiddle = sum(list); 
 

 
document.getElementById("output2").innerHTML = sumofmiddle; 
 

 
var sumofmodmid = sum(outcome); 
 

 

 
document.getElementById("output3").innerHTML = sumofmodmid; 
 

 
} 
 

 
function multiplier(L, M) { 
 

 
var money = []; 
 

 
for (i = 0; i < L.length; i++) { 
 

 
money[i] = (L[i] * M); 
 
} 
 

 
return money; 
 

 
} 
 

 
function sum(L){ 
 
var outcome = 0; 
 
if (L.length % 2 == 0) 
 
{ 
 
outcome = (Math.floor(L[L.length/2] + L[Math.floor((L.length/2) - 1)])/2); 
 
} 
 
else 
 
{ 
 
outcome = L[Math.floor((L.length - 1)/2)]; 
 
} 
 

 
return outcome; 
 

 
} 
 

 
</script> 
 
</head> 
 

 
<body> 
 

 
Please enter in a list of four values to be muliplied with the final value always being 5. <br> 
 

 
<input type="text" id="pokemon"><br> 
 
<input type="text" id="digimon"><br> 
 
<input type="text" id="transformers"><br> 
 
<input type="text" id="workers"><br><br> 
 

 
Please enter the multiplier.<br><br> 
 

 
<input type="text" id="multi"><br><br> 
 

 
<button type="button" onclick="collectdata()">Click here to multiply values</button> 
 

 
<div id="output1"></div><br><br> 
 

 
Bonus! Here is the average of the middle numbers of the arrays!<br> 
 

 
<div id="output2"></div><br><br> 
 

 
Final Surprise! Here is the average of the multiplied modified numbers!<br> 
 

 
<div id="output3"></div> 
 

 
</body> 
 
</html>

+0

私は参照してください。私は、新しい変数を作成することは、それが基づいているものを変更することは考えていませんでした。私は、既存の変数は、それらを呼び出すこととその内容を変更することによってしか変更できないと考えました。それは知って良いです。しかし、結果変数はなぜ変わるのでしょうか?私はあなたの助けに感謝します、あなたのコードは素晴らしい作品! –

+0

通常、jsの新しい配列に別の配列を代入すると、データではなく参照にコピーされます。質問[ここ](https://stackoverflow.com/questions/7486085/copying-array-by-value-in-javascript)を参照してください –

1

です。

var someArray = [] 

をしてから、これは実行します:また、あなたはこれを書くことはできません

someArray[1] = 'wrong'; 

あなたは通常の配列を移入する.push()メソッドを使用する必要があります。

使用これをと下部にスニペットを試してみてください。

function collectdata() 
 
{ 
 
    var list = [0, 0, 0, 0]; 
 

 
    list[0] = parseFloat(document.getElementById("pokemon").value); 
 
    list[1] = parseFloat(document.getElementById("digimon").value); 
 
    list[2] = parseFloat(document.getElementById("transformers").value); 
 
    list[3] = parseFloat(document.getElementById("workers").value); 
 

 
    var multiply = parseFloat(document.getElementById("multi").value); 
 
    var outcome = multiplier(list, multiply); 
 
    var spaceoutcome = outcome; 
 

 
    for (i = 0; i < outcome.length; i++) spaceoutcome[i] = " " + spaceoutcome[i]; 
 

 
    document.getElementById("output1").innerHTML = spaceoutcome; 
 

 
    var sumofmiddle = sum(list); 
 
    document.getElementById("output2").innerHTML = sumofmiddle; 
 

 
    var sumofmodmid = sum(outcome); 
 
    document.getElementById("output3").innerHTML = sumofmodmid; 
 

 
} 
 

 
function multiplier(L, M) 
 
{ 
 
    var money = []; 
 
    
 
    for (i = 0; i < L.length; i++) money.push(parseFloat(L[i] * M)); 
 
    return money; 
 
} 
 

 
function sum(L) 
 
{ 
 
    if (L.length % 2 == 0) return (parseFloat(L[L.length/2]) + parseFloat(L[L.length/2 -1]))/2; 
 
    else return L[(L.length+1)/2 - 1]; 
 
}
<!DOCTYPE HTML> 
 
<html lang="en-us"> 
 
<head> 
 
<meta charset="utf-8"> 
 
<title>Add Middle Array</title> 
 
</head> 
 

 
<body> 
 
Please enter in a list of four values to be muliplied with the final value always being 5. 
 
<br/> 
 

 
<input type="text" id="pokemon"><br> 
 
<input type="text" id="digimon"><br> 
 
<input type="text" id="transformers"><br> 
 
<input type="text" id="workers"><br><br> 
 

 
Please enter the multiplier. 
 
<br><br> 
 
<input type="text" id="multi"> 
 
<br><br> 
 

 
<button type="button" onclick="collectdata()">Click here to multiply values</button> 
 

 
<div id="output1"></div> 
 
<br><br> 
 

 
Bonus! Here is the average of the middle numbers of the arrays!<br> 
 

 
<div id="output2"></div> 
 
<br><br> 
 

 
Final Surprise! Here is the average of the multiplied modified numbers!<br> 
 

 
<div id="output3"></div> 
 

 
</body> 
 
</html>

+0

私は参照してください。それは多くを説明するだろう!私はそれをやり方で、配列の内容を文字列に変更したと思います。配列に値を追加するには、.push()メソッドを使用する必要があることに留意します。助けてくれてありがとう!私は誰もが答えを選ぶことができればと願っています。私は今問題を理解していると思う。 –

+0

あなたはいつもupvoteすることができます:)はい、あなたのコードのどこかで何か変なことが起こりました。私はあなたのコードを再入力し、いくつかのタイプミスを修正しました。だから、今はすべてがうまくいくはずです。あなたの問題を解決してうれしいです。平和。 – Ivan86

関連する問題