For循环始终使用最后一个值JavaScript-VueJS

For循环始终使用最后一个值JavaScript-VueJS,javascript,vue.js,for-loop,Javascript,Vue.js,For Loop,正如标题所描述的问题,我使用for循环提取数组元素并将其转换为JSON值,如下所示: 酒店={房间:2间,价格:[100200],职业:[“1个孩子”,“1个大人”] 并希望推进到JSON数组中 酒店=[{房间:1间,价格:100,职业:'1个孩子'},] 所以我试了一下: var json = { rooms : 1, price:null, occupation:null } for (let i=0 ; i < hotel.rooms ; i++){ json.pri

正如标题所描述的问题,我使用for循环提取数组元素并将其转换为JSON值,如下所示:

酒店={房间:2间,价格:[100200],职业:[“1个孩子”,“1个大人”]

并希望推进到JSON数组中

酒店=[{房间:1间,价格:100,职业:'1个孩子'},]

所以我试了一下:

var json = { rooms : 1, price:null, occupation:null }    
for (let i=0 ; i < hotel.rooms ; i++){
    json.price = hotel.price[i]
    json.occupation = hotel.occupation[i]
    this.hotels.push(json)
}
var json={rooms:1,price:null,occulation:null}
对于(设i=0;i

但是数组hotels总是有循环的最后一个值,并且(重复显示迭代的最后一个值),尝试使用try{throw i}catch(ii){…}但是不起作用

问题是数组的每个元素
这个。hotels
是对同一个
json
对象的引用-所以当它在任何地方发生变异时,所有这些数组元素都“看到”由于您在每次循环迭代中都会对
json
进行变异,并简单地覆盖相同的键,因此不可避免的是每个元素最终都是相同的

要修复它,只需推送对象的新“副本”——因此不会受到“主”json
对象突变的影响。有几种方法可以做到这一点,其中一种是对象扩展表示法:

this.hotels.push({...json});

您也可以使用
Object.assign({},json)
代替排列符号。或者保持代码原样,但移动
var json={…}
在循环内部,同时将
var
替换为
let
——以确保每次都是一个新的局部变量,而不是一个不断变化的全局变量。正如我所说,有很多解决方案。

问题是数组的每个元素
this.hotels
都是对同一
json
对象的引用-所以当我t在任何地方都是变异的,所有这些数组元素都“看到”了变化。由于在每次循环迭代中都会变异
json
,并简单地覆盖相同的键,因此不可避免的是每个元素最终都是相同的

要修复它,只需推送对象的新“副本”——因此不会受到“主”json对象突变的影响。有几种方法可以做到这一点,其中一种是对象扩展表示法:

this.hotels.push({...json});

您也可以使用
Object.assign({},json)
代替排列符号。或者保持代码原样,但移动
var json={…}
在循环内部,将
var
替换为
let
——以确保每次都是一个新的局部变量,而不是一个不断变化的全局变量。正如我所说,有很多解决方案。

对象是引用类型,每次推到hotels数组时都需要创建一个新对象

有几种方法可以解决此问题。两种简单的方法是:

在push方法中使用对象文本
this.hotel.push({rooms:1,price:hotel.price[i],occulation:hotel.occulation[i]})

--或--


将变量声明移动到循环中
var json={rooms:1,price:null,occulation:null}
对象是引用类型,每次推送到hotels数组时都需要创建一个新对象

有几种方法可以解决此问题。两种简单的方法是:

在push方法中使用对象文本
this.hotel.push({rooms:1,price:hotel.price[i],occulation:hotel.occulation[i]})

--或--


将变量声明移动到循环
var json={rooms:1,price:null,occulation:null}

正如我在回答中提到的,仅仅在循环中移动那一行并不能解决这个问题,除非
var
let
替换。只有这样,变量的作用域才会限定在循环体中,而
var
仍然是全局变量。谢谢你们两位给了我解决方案,我为let更改了var,并在循环体中移动了json循环和工作正常。正如我在回答中提到的,仅仅在循环中移动那一行并不能解决这个问题,除非
var
let
替换。只有这样,变量才会被限定在循环体的范围内,而
var
仍然是全局变量。谢谢你们两位给了我解决方案,我将var改为let和move在循环中添加json,工作正常。