Jquery循环重复创建相同的对象

Posted

技术标签:

【中文标题】Jquery循环重复创建相同的对象【英文标题】:Jquery loop creating same objects repeatedly 【发布时间】:2021-10-24 17:03:44 【问题描述】:

我有一个循环来填充 select2 的选项。如果我在我的 url 中选择了参数,我会从后端获取数据并在加载页面时自动填充它。所以我为它创建了 2 个循环。但它的生成选项多次。它创建的选项(DOM)与我的数组长度相同,我从 url 中的参数创建了一个数组。感谢您的帮助。

var myArr = urlProjects.split(",");
for (var i = 0; i < data.data.length; i++) 
    myArr.forEach(e => 
        if (parseInt(e) === data.data[i].id) 
            var option = new Option(data.data[i].name, data.data[i].id, false, true);
            element.select2().append(option);
            projectsArr.push(data.data[i].id);
         else 
            var option = new Option(data.data[i].name, data.data[i].id, false, false);
            element.select2().append(option);
        
    )


urlProjects (example) = 12877,12618,10925

data.data (array of objects- example object) = 
    "id": 12573,
    "name": "TEST",
    "clientID": 1119,
    "rsid": "23bdb244-c92b-42d6-bc58-3282edf27d08",
    "clientName": "test",
    "clients": 
        "client_id": 1119,
        "name": "test",
        "opClientName": "[test]"
    

【问题讨论】:

urlProjects 和 data.data(示例数据)中有什么? 我更新了帖子 您检查过您的代码执行的频率吗?也许您应该在代码之前删除所有选项,以确保您永远不会有重复条目 您当然还有一些其他相关代码,并调用您在某个侦听器中提供的这段代码。 element.select2() 是什么?一些图书馆的使用? projectsArr 是什么? 这是你在 foreach 循环中的 else 语句。如果您在 data 和 myArr 之间没有匹配,则无论如何都会放置一个元素。 myArr 正在循环遍历每个数据元素,因此您将拥有 data.length * myArr.length 个元素 【参考方案1】:

问题是你总是附加选项,但你应该重新填充数组。

所以,试着调整你的代码如下:

var myArr = urlProjects.split(",");

element.select2() = element.select2(); // Don't have a clue what element.select2() does, from code it looks like it returns an array - so you have to adjust this part. Idea is to empty the array of your option elements.
projectsArr = []; // More-less same here.

// And then - actually, re-fill your arrays again.
for (var i = 0; i < data.data.length; i++) 
    myArr.forEach(e => 
        if (parseInt(e) === data.data[i].id) 
            var option = new Option(data.data[i].name, data.data[i].id, false, true);
            element.select2().append(option);
            projectsArr.push(data.data[i].id);
         else 
            var option = new Option(data.data[i].name, data.data[i].id, false, false);
            element.select2().append(option);
        
    )

有一些更优化的方法 - 检查您的数组是否已经包含一些元素,然后只推送新元素和/或更新现有元素。

【讨论】:

以上是关于Jquery循环重复创建相同的对象的主要内容,如果未能解决你的问题,请参考以下文章

jQuery循环遍历具有相同类的动态创建的元素

jQuery创建对象[重复]

如何使用ajax将从jquery for循环创建的输入值发送到php [重复]

如何在Python中的for循环内创建对象列表而不继承属性值[重复]

强烈求助!!JS 动态循环创建DIV

JAVA中创建了多个对象,为什么只重复出现一个对象