2014-04-10 44 views
0

JavaScript嵌套條件。JavaScript根據不同條件顯示分數和消息

JS代碼詢問用戶2個問題,每個問題有4個選項作爲答案,每個答案都有一個特定的值,如果用戶的分數是6或更多,每個選擇的答案都是4會得到addiitonal評論,我試圖實施它,但我沒有管理它。

只是一個例子:

例子:

問題01:你喜歡巧克力嗎?答:很多。

問題02:你喜歡巧克力蛋糕還是胡蘿蔔蛋糕?答:兩者。

第一個答案得到了值4和第二個2,所以總共有6點。

var health = 'Very Healthy'; 
var average = 'Neither Healthy nor unhealthy'; 
var unhealthy = 'Unhealthy'; 

對於正確的解決方案的任何建議?

我在下面撥弄鏈接=>http://jsfiddle.net/Hf68f/

+0

在GetAdditionalComment2有一個叫未定義的變量scoreCake。 –

+0

@Dan Iveson,是的,我意外地犯了一個錯誤,好吧,我已經完成了更正,但代碼仍然無法正常工作。 – Acemi

回答

2

救了我的想法最新在你的上兩個函數(getAdditionalComment1getAdditionalComment2),你有一個語法錯誤。您正在使用()而不是{}來封裝該函數。它應該看起來像

function getAdditionalComment1(score, scoreChoco) 
{ // Changed here 
    if(score >=6){ 
     if (scoreChoco == 4) 
     return additionalCommentYesAlot; 
     else 
     return ""; 
    } 

} // And here 
function getAdditionalComment2(score, scoreCake) 
{ // And here 
    if(score >=6){ 
     if (scoreCake == 4) 
     return addionalCommentChocolate; 
     else 
     return ""; 
    } 

} // And here 

一旦解決了語法錯誤,代碼在我的測試中運行良好。

+0

謝謝,我確實犯了很多愚蠢的錯誤,我創建了一個新的小提琴:http://jsfiddle.net/cQJHq/,它實際上並不像我想要的那樣工作,它應該增加除了不健康之外的額外評論,所以它沒有這樣做。 – Acemi

+0

這兩個函數在你的小提琴的任何地方都沒有被調用。一旦你添加了,你應該可以很容易地爲你的元素添加額外的評論。 – Ktash

+0

所以我應該在函數getTotal()中調用它們。 – Acemi

1

我已經清理你的代碼,因此很容易增加新的問題,避免了幾乎重複的功能和使用代碼this answer選擇的消息:

var numericalValues = { 
    Alot: 4, 
    NotMuch: 2, 
    NoSometimes: 3, 
    Hate: 0, 
    Chocolate: 4, 
    Carrot: 0, 
    Both: 2, 
    None: 0 
}; 

function getScore(name) { 
    var form = document.forms["form"], 
     els = form.elements[name]; 
    for(var i=0; i<els.length; i++) 
     if(els[i].checked) 
      return numericalValues[els[i].value]; 
} 

var names = ['cake', 'choco']; 

function getTotal() { 
    var scores = [], totalScore = 0; 
    for(var i=0; i<names.length; ++i) 
     totalScore += scores[names[i]] = getScore(names[i]); 
    document.getElementById('result').innerHTML = 
     getComment(totalScore) 
     + '. '+ 
     getAdditionalComment(scores); 
} 

var comments = [ 
    [0, 'Very Healthy'],     /* For 0,1,2  */ 
    [3, 'Neither Healthy nor unhealthy'], /* For 3,4,5,6  */ 
    [7, 'Unhealthy']      /* For 7...Infinity */ 
], 
additionalComments = { 
    choco: [ 
     [4, 'you eat too much chocolate']/*, 
     [5, void 0] // Not needed since 4 is maximum */ 
    ], 
    cake: [ 
     [4, 'you have to start a diet']/*, 
     [5, void 0] // Not needed since 4 is maximum */ 
    ] 
}; 
function getValueInRange(arr, n, from, to) { 
    return (function main(from, to){ 
     if(from>=to) return void 0; 
     var mid = Math.floor((from+to)/2); 
     if(arr[mid][0] > n) return main(from, mid); 
     if(arr[mid][0] < n && mid > from) return main(mid, to); 
     return arr[mid][1]; 
    })(from===void 0 ? 0 : from, to===void 0 ? arr.length : to); 
} 
function getComment(score) { 
    return getValueInRange(comments, score); 
} 
function getAdditionalComment(scores) { 
    var arr = []; 
    for(var i=0, l=names.length; i<l; ++i) { 
     var txt = getValueInRange(
      additionalComments[names[i]], 
      scores[names[i]] 
     ); 
     if(txt) arr.push(txt); 
    } 
    return arr.join(', '); 
} 

document.getElementById('calculate').onclick=getTotal; 

Demo

+0

非常感謝你,我很感激它,真的很友善:) – Acemi

+1

@Acemi不是在所有的:)有些東西可能是先進的,但是你可以使用一些與你的代碼沒什麼不同的東西,比如'getScore(name)'而不是幾乎重複的'getScoreChoco()'和'getScoreCake()' – Oriol