javascript - जावास्क्रिप्ट 5== 8 के बराबर क्यों है?




html checkbox (2)

इसलिए मेरे पास 2 चेक-बॉक्स हैं:

var statusList = [];
function updateStatusString(x) {
    if (statusList != null) {
        if (statusList.length > 0) {
            for (var i = 0; i < statusList.length; i++) {
                if (parseInt(statusList[i]) == parseInt(x)) {
                    statusList[i] = 123;
                } else {
                    statusList.push(x);
                }
            }
        } else {
            statusList.push(x);
        }
    }
    alert(statusList);
}
<label>&nbsp;<input type="checkbox" name="Active" value="5" onchange=updateStatusString("5")>&nbsp;"Active"</label>
<label>&nbsp;<input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("8")>&nbsp;"Active"</label>

जब मैं एक चेकबॉक्स पर क्लिक करता हूं, तो यह एक जावास्क्रिप्ट सूची में जोड़ता है, अगर यह पहले से ही सूची में है तो मैं इसे दूसरे मूल्य (इस उदाहरण में 123) के साथ लिखना चाहता हूं।

लेकिन जब मैं दूसरे पर क्लिक करता हूं (आदेश पर कोई फर्क नहीं पड़ता, तो 2 तत्व हमेशा किसी कारण से 123 होता है।

जहाँ मुझे उम्मीद है कि अगर मैं शीर्ष चेक-बॉक्स पर क्लिक करता हूँ तो यह '5' वाली सूची होगी, तो दूसरे चेक-बॉक्स पर क्लिक करने पर मुझे 5,8 की उम्मीद होगी, लेकिन यह 5,123 रूप में अलर्ट करता है, वास्तव में यह नहीं देख रहा है कि यह क्यों कर रहा है यह 5==8 मिथ्या है ... कोई विचार?

अंतर्निहित समस्या को ठीक करने के लिए अद्यतित एल्गोरिथ्म:

अगर किसी को कभी भी यह उपयोगी लगता है तो मैंने एल्गोरिथ्म को एक बेहतर विकल्प में बदल दिया:

var statusList = [];
function updateStatusString(x) {
    if (statusList.length > 0) {
        if (statusList.includes(x)) {
            var idx = statusList.indexOf(x);
            if (idx != -1) {
                statusList.splice(idx, 1);
            }
        }
        else {
            statusList.push(x);
        }
    } else {
        statusList.push(x);
    }
    alert(statusList);
}

ऐसा लगता है कि लूप आपके मुद्दे का कारण बन रहा था।

  1. आप x के अस्तित्व के लिए जाँच कर रहे थे, जो पहले लूप पर झूठी थी
  2. आपने इसे सरणी में धकेल दिया
  3. दूसरा लूप, इसका अस्तित्व था और इसे 123 के साथ बदल दिया गया था

यदि आप चेक में से किसी एक को हटाकर, और looping के बजाय array.prototype.includes का उपयोग करके और समानता की जाँच करके अपने कोड को नाटकीय रूप से सरल बना सकते हैं।

संपादित करें: 123 जोड़ा जा रहा है प्रदर्शित करने के लिए एक तीसरा इनपुट जोड़ा गया।

var statusList = [];
function updateStatusString(x) {
    if (statusList != null) {
      if (statusList.includes(x)) {
          statusList[statusList.indexOf(x)] = 123;
      } else {
          statusList.push(x);
      }
    }
    
    alert(statusList);
}
<label>&nbsp;<input type="checkbox" name="Active" value="5" onchange=updateStatusString("5")>&nbsp;"Active"</label>
<label>&nbsp;<input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("8")>&nbsp;"Active"</label>
<label>&nbsp;<input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("5")>&nbsp;"Active"</label>


क्योंकि आप statusList पर statusList हो रहे हैं। पहले पुनरावृत्ति पर आप जाँचते हैं यदि 5 == 8 है, तो दूसरे भाग में जाता है और 8 में सम्मिलित करता है। आपका स्टेटसलिस्ट = [५, =] है। अगले पुनरावृत्ति के लिए, यह सही statuslist[i] बन जाता है statuslist[i] 8 और 8 === 8 होगा और आपका कथन - statusList[i] = 123; अंतिम सम्मिलित 8 मान को 123 से बदल देगा। इसलिए, आपके स्टेटसलिस्ट व्यूअर में ["5", 123]

var statusList = [];

function updateStatusString(x) {
  const input = parseInt(x);
  if (statusList != null) {
    if (statusList.includes(input)) {
      const idx = statusList.indexOf(input);
      statusList[idx] = 123;
    } else {
      statusList.push(input);
    }
    alert(statusList);
  }
}
<label>&nbsp;<input type="checkbox" name="Active" value="5" onchange=updateStatusString("5")>&nbsp;"Active"</label>

<label>&nbsp;<input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("8")>&nbsp;"Active"</label>






equality