2016-02-09 96 views
8

語境從JavaScript對象刪除陣列

我想,這樣當一個表中的複選框,屬性value和複選框的data-title用戶點擊應存放在一個JS來實現功能作爲新的鍵 - 值對數組元素的名爲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

爲什麼不使其取決於複選框的「checked」狀態?我假設你的數組應該代表當前被檢查的方框。 – KWeiss

+1

這可能是'val.key == $(this).attr(「value」)'的問題。這可能(可能是由於Javascript中平等的奇怪),從來沒有回報。你也應該使用[===](http://stackoverflow.com/questions/359494/does-it-matter-which-equals-operator-vs-i-use-in-javascript-comparisons)。 [調試你的javascript](http://stackoverflow.com/questions/988363/how-can-i-debug-my-javascript-code)並檢查這 – Liam

+0

寫得很好的問題順便說一句,做得好。如果只有每個低代表用戶都是這個體貼的 – Liam

回答

6

你的thiseach錯誤的上下文。它不再是在單擊處理元素

嘗試

$('#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

@利姆指出,Sam32應該明確使用'==='。我不想改變你的代碼很多......只是指出*「爲什麼」*這有時比學習所有新方法來做到這一點更重要,而不是根本解決原始問題 – 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() 
});