0

根据我看到的一个帖子。我正在通过单击超链接创建一个临时数组元素。我唯一的问题是它可以生成重复的元素,直到现在还没有解决:

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”,它搜索插入的数组,如果有则返回 FALSE,以避免在数组中插入并在表中生成一行:

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

但是这个函数总是返回 FALSE。

因为我可以在插入元素之前避免重复?如果有更好的方法来做到这一点......我希望我能提供帮助。

4

2 回答 2

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) )

删除了!

于 2012-05-19T13:47:49.413 回答
1

您在 $.each 中混淆了索引和元素的顺序,并且您只能从 $.each 函数内部返回,而不是从 $.findFromArray 函数内部返回:

$.findFromArray = function(property, value, arr)
    var ret=false;
    $.each(arr, function(index, elem) {
        if (elem[property] === value) ret=true;
    }); 
    return ret;
};
于 2012-05-19T14:07:51.323 回答