繁体   English   中英

如何一次向一个数组添加(推送)项目(循环遍历数组)

[英]How do I add (push) items to an array one at a time (looping through array)

我无法想象这个奇怪的问题。 链接到Jsbin

我正在尝试使用单击功能向数组( prices )添加值。 当用户单击按钮时,它会将定价数据添加到Javscript数组prices

我需要一次添加多个数据条目,其中包含价格但不同的day

这是#add_pricing的点击功能。

$("#add_pricing").click(function(e){
    e.preventDefault();
    data = {
        "price": "1200",
        "days": ["1","3","4"]
    }
    addData(data);
    console.log(prices)
});

因此,当用户单击它时,您可以看到它将data变量发送到addData,即:

function addData(data)
{
    for (i = 0; i < data.days.length; i++){
        data.day = data.days[i]; //eg. data.day = "1"
        prices.push(data);

    }
}

所以addData addData()函数循环遍历data.days,我希望它将一个条目推送到prices数组,但一次一个。

但相反,它似乎每次都会推送所有4个项目(你可以看看你是否记录输出)

在此输入图像描述

并且它没有正确设置我的日变量,白天总是设置为4,即使我记录输出,它似乎显示正确的一个。

在此输入图像描述

预期产量:

[1] => {day: 1, price: 1200}
[2] => {day: 3, price: 1200}
[3] => {day: 3, price: 1200}

实际输出

[1] => {day: 4, price: 1200}
[2] => {day: 4, price: 1200}
[3] => {day: 4, price: 1200}

您只是一遍又一遍地修改dataday属性。 永远不会重新创建data对象。

你的意思是这样做的吗?

function addData(data)
{
    for (i = 0; i < data.days.length; i++){
        data.day = data.days[i]; //eg. data.day = "1"
        prices.push(data.day); // push data.day?

    }
}

如果您确实想要克隆该对象,可以使用JQuery的扩展来实现。 或者,如果您在节点中,则扩展模块执行相同的操作。

function addData(data)
{
    for (i = 0; i < data.days.length; i++){
        var newData = $.extend({}, data);
        newData.day = data.days[i]; //eg. data.day = "1"
        prices.push(newData);

    }
}

如果真实代码中的对象与您在问题中使用的对象一样简单,那么创建新对象可能更容易:

function addData(data)
{
    for (i = 0; i < data.days.length; i++){
        prices.push({
          price: data.price,
          day: data.days[i]
        });
    }
}

以下代码将起作用

function addData(data)
        {
            for (i = 0; i < data.days.length; i++){
                prices.push({ day: data.days[i], price: data.price  });
            }
        }

更改:

prices.push(data);

至:

prices.push({ day: data.days[i], price: data.price  });

你的问题在这里:

function addData(data)
{
    for (i = 0; i < data.days.length; i++){
        data.day = data.days[i]; //eg. data.day = "1"
        prices.push(data[i]); //this needs to only add the current object not the entire array of objects

    }
}

您正在推送对同一对象的多个引用。 在循环的每次迭代中,您修改同一对象.day属性。

您需要在循环中创建一个对象并推送:

function addData(data)
{
    for (i = 0; i < data.days.length; i++){
        prices.push({
          day : data.days[i],
          price : data.price
        });    
    }
}

用这个

 function addData(data)
 {
    for (i = 0; i < data.days.length; i++){
       data.day = data.days[i]; //eg. data.day = "1"
       if(prices.length > 0)
          prices[prices.length] = data;
       else 
          prices[0] = data;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM