【问题标题】:How do I add (push) items to an array one at a time (looping through array)如何一次将一个项目添加(推送)到一个数组(循环遍历数组)
【发布时间】:2015-09-19 05:29:22
【问题描述】:

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

而且它没有正确设置我的 day 变量,day 总是设置为 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}

【问题讨论】:

    标签: javascript jquery arrays for-loop push


    【解决方案1】:

    您只是一遍又一遍地修改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 这样做。或者如果你在 node 中,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]
            });
        }
    }
    

    【讨论】:

    • 不,我想将数据多次推送到数组,但每次都使用修改后的日期值。
    • 最后有一个包含三个项目的数组,每个项目都有一个价格和一个天值(如 1 或 3)
    • 谢谢,了解这两件事很有用
    • 很高兴为您提供帮助。祝你好运:)
    【解决方案2】:

    以下代码将起作用

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

    【讨论】:

    • 谢谢,这正是我想要的。
    【解决方案3】:

    变化:

    prices.push(data);
    

    收件人:

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

    【讨论】:

      【解决方案4】:

      你的问题在这里:

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

          使用这个

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

          【讨论】:

            猜你喜欢
            • 2018-07-11
            • 2019-01-19
            • 2014-04-23
            • 2018-04-07
            • 1970-01-01
            • 2020-12-22
            • 2020-01-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多