如何一次将一个项目添加(推送)到数组中(循环遍历数组)
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}
你只是在一遍又一遍地修改data
的day
属性。 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;
}
}
我想不通这个奇怪的问题。 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}
你只是在一遍又一遍地修改data
的day
属性。 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;
}
}