2016-09-30 19 views
6

क्यों बदल रहे हैं, मैं यह पता लगाने की कोशिश कर रहा हूं कि मेरे चार्ट में मान सही तरीके से क्यों नहीं आ रहे हैं। जब मैं learningLanguages[j].count++ के मानों को लॉग करता हूं क्योंकि यह लूपिंग है तो वे सटीक हैं। हालांकि, जब मैं चार्ट $.map(nativeLanguages, function(n) {...}) में नक्शा समारोह में n प्रवेश करते है, मायने रखता है आपकी समस्या के सभी गलत (और उचित रूप में मनमाने ढंग से)यह पता नहीं लगा सकता कि मेरी ऑब्जेक्ट्स में मान

var getLanguages = $.get('/languages.json', function(languages){ 
     // top level language arrays 
     learningLanguages = [] 
     nativeLanguages = [] 

     // object constructor that correctly formats the language objects 
     function Language(lang) { 
      this.language = lang; 
      this.count = 0; 
     } 

     // Loop through the languages, create an object for each, push to top level language arrays 
     for(i = 0; i < languages.length; i++) { 
      currentLanguage = new Language(languages[i].language) 

      learningLanguages.push(currentLanguage) 
      nativeLanguages.push(currentLanguage) 
     } 
    }); 

    // once the languages call is complete find signed-in user's info 
    getLanguages.done(function() { 
     $.get('/users.json', function(response) { 
      // console.log(response) 
      // adds the total number of users to the DOM 
      var numberOfUsers = response.length 
      $('#userCount').append('<h1>Total Users: ' + numberOfUsers + '</h1>') 
      // find the number of approved users 
      // var numberApproved = 0 
      // for (i = 0; i < response.length; i++) { 
      //  if (response[i].approved === true) { 
      //   numberApproved++ 
      //  } 
      // } 
      // Add the number of approved users to the DOM 
      // $('#userCount').append('<h1>Total Approved Users: ' + numberApproved + '</h1>') 


      // search for the language in the array and increase the count for that language 
      for (i = 0; i < response.length; i++) { 
       var userLearningLanguage = response[i].learning_language 

       for (j = 0; j < learningLanguages.length; j++) { 
        if (learningLanguages[j].language === userLearningLanguage) { 
         learningLanguages[j].count++ 
        } 
       } 
      } 
      // search for the language in the array and increase the count for that language 
      for (i = 0; i < response.length; i++) { 
       var userNativeLanguage = response[i].native_language 
       for (j = 0; j < nativeLanguages.length; j++) { 
        if (nativeLanguages[j].language === userNativeLanguage) { 
         nativeLanguages[j].count++ 
        } 
       } 
      } 

      var ctx = $("#languageComparisonChart"); 
      var myChart = new Chart(ctx, { 
       type: 'bar', 
       data: { 
        labels: 
         $.map(learningLanguages, function(n) { 
          return n.language 
         }), 
        datasets: [{ 
         label: '# of Learners', 
         data: $.map(learningLanguages, function(n) { 
           return n.count 
          }), 
         backgroundColor: 'rgba(255, 99, 132, 0.2)', 
         borderColor: 'rgba(255,99,132,1)', 
         borderWidth: 1 
        }, 
        { 
         label: '# of Native Speakers', 
         data: $.map(nativeLanguages, function(n) { 
          console.log(n) 
           return n.count 
          }), 
         backgroundColor: 'rgba(54, 162, 235, 0.2)', 
         borderColor: 'rgba(54, 162, 235, 1)', 
         borderWidth: 1 
        }] 
       }, 
       options: { 
        scales: { 
         yAxes: [{ 
          ticks: { 
           beginAtZero:true 
          } 
         }] 
        }, 
        responsive: false, 
        maintainAspectRatio: true 
       } 
      }); 
     }) 
    }); 
} 
+0

क्या आपने 'for' loop के बाद सही लॉग इन करने का प्रयास किया है? या बस इसके अंदर? –

+0

क्या यह सब कोड है ?, क्योंकि यहां बहुत सारी त्रुटियां हैं। जैसे। उन्हें परिभाषित किए बिना आपके उपयोग चर। आप किसी भी संकेत का उपयोग नहीं कर रहे हैं? .. इंडेंटिंग भी गलत है, और आपके पास अतिरिक्त} – Keith

+0

है और आपको अर्ध-कॉलन का उपयोग लाइनों को समाप्त करने के लिए करना चाहिए - देखें [यहां जवाब] (http://stackoverflow.com/questions/444080/ डू-यू-अनुशंसा-उपयोग-अर्धविराम-बाद-हर-कथन-इन-जावास्क्रिप्ट) –

उत्तर

7

भाग यहाँ 2 अलग विन्यास में, एक ही वस्तु को आगे बढ़ाने की वजह से उपजी हैं:

for(i = 0; i < languages.length; i++) { 
     currentLanguage = new Language(languages[i].language) 

     learningLanguages.push(currentLanguage) 
     nativeLanguages.push(currentLanguage) 
    } 

यह प्रत्येक में currentLanguage की प्रतिलिपि नहीं करता है, यह प्रत्येक वस्तु के संदर्भों को प्रत्येक में धक्का देता है।

फिर जो कुछ भी आप एक में है कि वस्तु संदर्भ के लिए कर अन्य

में परिलक्षित होगा 2 अलग वस्तुओं

for(i = 0; i < languages.length; i++) { 
     learningLanguages.push(new Language(languages[i].language)) 
     nativeLanguages.push(new Language(languages[i].language)) 
    } 

वैश्विक चर का उपयोग भी मुसीबत में आप मिल जाएगा बनाने का प्रयास करें ... ऐसा मत करो!

+0

धन्यवाद! यह निश्चित रूप से एक मुद्दा था। प्रत्येक सरणी में प्रत्येक भाषा के लिए गिनती मान समान थे क्योंकि वे संदर्भ थे। आपकी सहायताके लिए धन्यवाद! – user3006927

1
learningLanguages = [] 
nativeLanguages = [] 

ये दो चर जैसे दिखते हैं कि उन्हें उपर्युक्त क्षेत्र में परिभाषित नहीं किया गया है - इस प्रकार दूसरा एक्सएचआर कॉल इन चर के बारे में नहीं जानता है।

उत्तर का दूसरा भाग उसी ऑब्जेक्ट उदाहरण के संदर्भ में है, उसी "गिनती" विशेषता को दो बार स्पर्श किया गया है।

मेरा सुझाव था दो विकल्प यहां हैं: अलग

  • इन दो सरणियों से प्रत्येक के लिए

    • उपयोग new Language(...) या native/learning मायने रखता है के प्रत्येक प्रकार के लिए एक अलग काउंटर की है।
  • +0

    इस प्रतिक्रिया के लिए धन्यवाद! मैंने उन दो एरे को पहले AJAX कॉल से बाहर ले जाया और मैं दोनों के लिए var का उपयोग कर रहा हूं ताकि वे अब वैश्विक चर नहीं हैं – user3006927

    संबंधित मुद्दे