2016-02-09 16 views
8

प्रसंगजावास्क्रिप्ट वस्तु से सरणी निकालें

मैं इतनी है कि जब किसी तालिका की एक चेकबॉक्स, विशेषता value और चेकबॉक्स का data-title पर उपयोगकर्ता क्लिक करता है एक जे एस में संग्रहित किया जाना चाहिए एक सुविधा को लागू करने के लिए कोशिश कर रहा हूँ ऑब्जेक्ट शाब्दिक नाम selected एक नई कुंजी-मूल्य जोड़ी सरणी तत्व के रूप में।

यदि उपयोगकर्ता एक ही चेकबॉक्स पर दूसरी बार क्लिक करता है, तो संबंधित सरणी तत्व हटा दिया जाना चाहिए।

अंक

पहली बार एक चेकबॉक्स क्लिक किया जाता है के रूप में इरादा, एक सरणी वस्तु selected में बनाया जाता है।

हालांकि, जब एक ही चेकबॉक्स को दूसरी बार क्लिक किया जाता है, तो संबंधित सरणी को हटाने के बजाय, एक नया (दोहराया गया) जोड़ा जाता है।

कोड

var selected = {items:[]};  
$('#table').on('click', 'input[type="checkbox"]', function() { 
    var found = false; 
    $.each(selected.items, function(i, val) { 
     if (val.key == $(this).attr("value")) { 
      selected.items.splice(i ,1); 
      found = true; 
      return false; //step out of each() 
     } 
    }); 

    if (found == false) { 
     selected.items.push({key: $(this).attr("value"), value: $(this).attr("data-title")}); 
    } 

    console.log(selected); 
}); 
+0

इसे चेकबॉक्स की 'चेक' स्थिति पर निर्भर करते हैं? मुझे लगता है कि आपकी सरणी को वर्तमान में चेक किए गए बक्से का प्रतिनिधित्व करना चाहिए। – KWeiss

+1

यह संभवतः 'val.key == $ (this) .attr (" value ")' के साथ एक समस्या है। यह संभवतः (जावास्क्रिप्ट में समानता की अजीबता के कारण), कभी सच नहीं होता है। आपको शायद [===] (http://stackoverflow.com/questions/359494/does-it-matter-which-equals-operator-vs-i-use-in-javascript-comparisons) का उपयोग करना चाहिए। [अपने जावास्क्रिप्ट को डीबग करें] (http://stackoverflow.com/questions/988363/how-can-i-debug-my-javascript-code) और यह – Liam

+0

अच्छी तरह से लिखित प्रश्न बीटीडब्ल्यू की जांच करें, अच्छी तरह से किया गया। यदि केवल हर कम प्रतिनिधि उपयोगकर्ता इस विचारशील – Liam

उत्तर

6

आप each अंदर this की गलत संदर्भ है। यह अब क्लिक हैंडलर में तत्व

प्रयास करें

$('#table').on('click', 'input[type="checkbox"]', function() { 
    var found = false; 
    var value = $(this).val();// store value from `this` before entering `each` 
    $.each(selected.items, function(i, val) { 
     if (val.key == value) { 
      selected.items.splice(i ,1); 
      found = true; 
      return false; //step out of each() 
     } 
    }); 
    .... 
+0

[बुराई जुड़वां का उपयोग न करें] (http://stackoverflow.com/a/359509/542251) – Liam

+0

यह समस्या का मूल कारण है। – Sam32

+0

@ सैम 32 निश्चित रूप से '===' का उपयोग लिम के रूप में किया जाना चाहिए। मैं आपका कोड बहुत बदलना नहीं चाहता था ... बस * "क्यों" * को इंगित करें जो कभी-कभी इसे करने के सभी नए तरीकों को सीखने और मूल समस्या की जड़ नहीं पाने के लिए अधिक महत्वपूर्ण है – charlietfl

3

पहले, मैं, मुख्य-मान-जोड़ी वस्तु का उपयोग करने की सलाह देते हैं, क्योंकि यह रास्ता खोज के लिए आसान है।

var selected = { items : {} }; 

इस तरह से आप

selected.items[my.key] 

का उपयोग कर शायद इस तरह somethink अपने चयनित आइटम का उपयोग होगा ...

var selected = {items:{}};  
$('#table').on('change', 'input[type="checkbox"]', function() { 
    var checked = $(this).is(":checked"), 
     title = $(this).data("data-title"), 
     value = $(this).val(); 

    if (checked && !selected.items[value]) 
     selected.items[value] = title; 
    else if (!checked && !!selected.items[value]) 
     delete selected.items[value]; 
}); 
0

कैसे इस एक के बारे में: क्यों नहीं

var selected = { items:[] }; 

$('#table').on('click', 'input[type="checkbox"]', function() { 
    selected.items = $('#table input[type="checkbox"]:checked').map(function(){ 
     return { 
      key: $(this).attr('value'), 
      value: $(this).attr('data-title') 
     } 
    }).toArray() 
}); 
संबंधित मुद्दे