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

时间:2015-07-01 21:13:31

标签: javascript jquery arrays for-loop push

我无法解决这个奇怪的问题。 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个项目(您可以查看是否记录输出)

enter image description here

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

enter image description here

预期产出:

[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}

6 个答案:

答案 0 :(得分:1)

您只是一遍又一遍地修改day的{​​{1}}属性。永远不会重新创建data对象。

你的意思是这样做吗?

data

如果您确实要克隆该对象,可以使用JQuery's extend来执行此操作。或者,如果您在节点中,extend模块也会执行相同的操作。

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?

    }
}

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

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

    }
}

答案 1 :(得分:1)

以下代码可以使用

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

答案 2 :(得分:1)

变化:

prices.push(data);

要:

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

答案 3 :(得分:0)

你的问题在这里:

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

    }
}

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

使用此

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