2014-10-01 3 views
0

Я работаю над проблемой coderbyte в течение последних двух дней. Я думал, что я, наконец, его купил по какой-то причине, я продолжаю ошибаться.Режим поиска и медиана в ошибке Javascript

function comparemedianandmode(arr){ 

    function findmode(arr){ 
     mapping = {}; 
     mode = 0; 
     for(var i = 0; i < arr.length; i++){ 
      if(!mapping[arr[i]]){ 
       mapping[arr[i]] = 0; 
      } 
      mapping[arr[i]] += 1; 
     }  
     for(prop in mapping){ 
      if(mapping[prop] > mode){ 
       var mode = parseInt(prop); 
      } 
     } 

    } 

    function findmedian(arr){ 
     arr.sort(function(a,b){return a - b}); 
     if(arr.length % 2 === 0){ 
      var median = (arr[(arr.length/2)-1] + arr[arr.length/2])/2; 
     } 
     else{ 
      var median = arr[(arr.length - 1)/2]; 
     } 

    } 
    var answer = (median === mode) ? 1 : 0; 
return answer 
    } 

Когда я пытаюсь comparemedianandmode([1,2,3,3,3,4,5]) я получаю следующее сообщение об ошибке:

ReferenceError: median is not defined 

Должно быть что-то простое, но я не могу показаться, чтобы понять это

EDIT

New Code: 
function comparemedianandmode(arr){ 
var mode; 
var median; 


function findmode(arr){ 
    mapping = {}; 

    for(var i = 0; i < arr.length; i++){ 
     if(!mapping[arr[i]]){ 
      mapping[arr[i]] = 0; 
     } 
     mapping[arr[i]] += 1; 
    }  
    for(prop in mapping){ 
     if(mapping[prop] > mode){ 
      var mode = parseInt(prop); 
     } 
    } 

} 
var median 
function findmedian(arr){ 
    var median 
    arr.sort(function(a,b){return a - b}); 
    if(arr.length % 2 === 0){ 
     median = (arr[(arr.length/2)-1] + arr[arr.length/2])/2; 
    } 
    else{ 
     median = arr[(arr.length - 1)/2]; 
    } 
} 
var answer = (median === mode) ? 1 : 0; 
return answer 
} 

comparemedianandmode([1,2,3,3,3,4,5]) 

=> 1 

ответ

2

Объявление переменной с var ограничит область действия функцией, в которой она объявляется. Вы объявляете median таким образом внутри findmedian(), но затем пытаетесь получить доступ к median вне этой функции в строке, которая присваивает значение answer.

Удалить var с строк, в которых вы указываете median значение. В верхней части comparemedianandmode() (ваша внешняя функция), объявить median:

var median; 

У вас есть функции внутри функции, а внутренняя функция, где вы объявляете median, но тогда вы пытаетесь использовать его вне, что внутренняя функция в этой строке:

var answer = (median === mode) ? 1 : 0; 

Кстати, вы должны сделать то же самое для mode.

Вот что он будет выглядеть после того, как все, что:

function comparemedianandmode(arr){ 

    var median; 
    var mode; 

    function findmode(arr){ 
     mapping = {}; 
     mode = 0; 
     for(var i = 0; i < arr.length; i++){ 
      if(!mapping[arr[i]]){ 
       mapping[arr[i]] = 0; 
      } 
      mapping[arr[i]] += 1; 
     }  
     for(prop in mapping){ 
      if(mapping[prop] > mode){ 
       mode = parseInt(prop); 
      } 
     } 
    } 

    function findmedian(arr){ 
     arr.sort(function(a,b){return a - b}); 
     if(arr.length % 2 === 0){ 
      median = (arr[(arr.length/2)-1] + arr[arr.length/2])/2; 
     } else { 
      median = arr[(arr.length - 1)/2]; 
     } 
    } 

    answer = (median === mode) ? 1 : 0; 
    return answer; 
} 

console.log(comparemedianandmode([1,2,3,3,3,4,5])); 
+0

Почему я не могу просто не использовать 'var' внутри функции при определении режима и медиану. Я думал, что это определит его глобально? – theamateurdataanalyst

+0

Нет, он не будет определять его глобально. Он определит его для этой функции. Он будет определять его только глобально, если он не входит в функцию. – Trott

+0

gotcha thanks trott имеет смысл. – theamateurdataanalyst