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

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

我想不通这个奇怪的问题。 Link to 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() 函数循环遍历 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's extend to do so. Or if you're in node, the extend 模块做同样的事情。

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

您的问题在这里:

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

    }
}

变化:

prices.push(data);

收件人:

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

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

.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;
    }
}