标签导航:

JavaScript数组push方法循环添加元素时,如何避免重复输出的问题?

本文探讨javascript中使用arrays.push方法向数组添加元素时,for循环导致重复输出的问题及解决方案。 问题源于在动态添加表单字段时,循环中将同一个对象反复添加到数组,导致最终数组中所有元素都指向同一个对象,显示最后一个值。

以下代码片段展示了错误的代码:

form.on('submit(*)',function(data) {
    var arrays=new Array();
    var products={}; // 错误:products对象声明在循环外
    var for_id=1;
    for(let index=0; index<currentid; index++){
        // ... 获取字段值 ...
        products = {/* 字段值 */}; // 更新同一个products对象
        arrays.push(products);
        console.log(false); // 此处console.log输出不影响问题
    }
    var json_arrays = JSON.stringify(arrays);
    return false;
});

问题在于products对象声明在for循环外部。每次循环都只是修改了同一个products对象,而不是创建新的对象。因此,arrays数组中存储的都是指向同一个products对象的引用。

解决方案是将products对象的声明移入for循环内部:

form.on('submit(*)',function(data) {
    var arrays=new Array();
    var for_id=1;
    for(let index=0; index<currentid; index++){
        // ... 获取字段值 ...
        var products = {/* 字段值 */}; // 正确:products对象声明在循环内
        arrays.push(products);
    }
    var json_arrays = JSON.stringify(arrays);
    return false;
});

这样,每次循环都会创建一个新的products对象,arrays数组中存储的是不同对象的引用,从而避免了重复输出的问题。 这体现了JavaScript中引用类型和值类型的区别: 对象是引用类型,数组存储的是对象的引用,而非对象的副本。 将products声明在循环内,确保每次迭代都创建一个新的对象,解决重复输出问题。

修改后的代码避免了重复输出,确保每个表单字段的值都被正确地添加到数组中。 记住,对于对象等引用类型,需要在循环内重新创建新的实例,才能避免数据被覆盖。