2012-05-19 114 views
0

根據我見過的文章。我通過單擊超鏈接創建臨時數組元素。我唯一的問題是,它可以產生重複的元素,到現在爲止還沒有解決:jquery array:防止重複插入

var items = new Array(); 
$("ul.dropdown li a").click(function(e) 
{ 
    e.preventDefault(); 

    var id  = $(this).attr('href'); 
    var name = $(this).text(); 

    if(!$.findFromArray('id', id, items)) 
    { 
     return false;  
    } 
    else 
    { 
     items.push({ 
      "id" : id, 
      "name": name 
     }); 

     //genate row 
     var newRow = $("<tr itemId=\"" + id + "\" />") 
     .appendTo(".form_list.left tbody") 
     .append("<td>" + name + "</td>") 
     .append("<td><a href=\"#\" class=\"deleteRow\">delete</a></td>"); 


     $(".deleteRow", newRow).click(function(e) { 
       e.preventDefault(); 
       items = $.removeFromArray('id', $(this).closest("tr").attr("itemId"), items); 
       $(this).closest("tr").remove(); 
     });  
    } 
}); 

我創建了一個函數「$ .FindFromArray」,其搜索陣列插入和返回如果有假避免插入陣列並在表中生成一行:

$.findFromArray = function(property, value, arr) 
{ 
    $.each(arr, function(elem, index) 
    { 
     if(elem[property] === value) 
     { 
      return false;   
     } 
    }); 
}; 

但是,此函數總是返回我FALSE。

因爲我可以在插入元素之前避免重複?如果有更好的方法去做...我希望我能幫上忙。

+0

嘗試使用$ .inArray (); - > http://api.jquery.com/jQuery.inArray/ – benqus

回答

3

改變你的方法

$.findFromArray = function(property, value, arr) 
{ 
    var matching = $(arr).filter(function(index, elem) 
    { 
     return elem[property] === value; 
    }); 
    return matching.length > 0; 
}; 

這個返回true如果發現陣列中元素(使它更具可讀性這樣),所以你也應該改變檢查

if($.findFromArray('id', id, items)) 

刪除了!

+0

但是我總是返回TRUE,當數組已經存在於數組 – csotelo

+0

@csotelo,nope時應該返回FALSE。如果元素存在於數組中,則我發佈的方法返回「true」;如果元素不存在,則返回「false」。如果你想反轉結果,把最後一行改爲'return matching.length === 0' –

+0

哎呀抱歉!我把函數放在alert中,但是改變if語句,現在它工作的很好!謝謝! – csotelo

1

你混了在$。每個指標和元素的順序,你只能從$。每個函數中返回,而不是$ .findFromArray功能:

$.findFromArray = function(property, value, arr) 
    var ret=false; 
    $.each(arr, function(index, elem) { 
     if (elem[property] === value) ret=true; 
    }); 
    return ret; 
};