一个对象转为数组对象

预期:

categories:{0: "语种", 1: "风格", 2: "场景", 3: "情感", 4: "主题"}

转为

catlist= [{cat: "语种"}{cat: "风格"}{cat: "场景"}{cat: "情感"}{cat: "主题"}]

实际

for(let i in categories ){
    catag.cat = categories[i];
    catlist.push(catag);
    console.log(catlist);             
}
catlist= [{cat: "主题"}{cat: "主题"}{cat: "主题"}{cat: "主题"}{cat: "主题"}]

实在是不知道为什么,为什么循环数组push会更改前面push的值

阅读 5.9k
7 个回答

简单,因为你的catag的地址没变过,你每一次循环都是改的同一个catag的值,然后把同一个catag插入到数组中。
而不是你猜测的数组push会更改前面push的值。
改成这样:

for(let i in categories ){
    const catag={}
    catag.cat = categories[i];
    catlist.push(catag);
    console.log(catlist);             
}

因为你这个catag没有重新定义,都是指向同一个引用,你要在循环里面每次重新定义一个,或者直接push

for (let i in categories) {
  catlist.push({cat: categories[i]})
}

let categories={0: "语种", 1: "风格", 2: "场景", 3: "情感", 4: "主题"}, catlist=[]; Object.values(categories).map((item)=>{ catlist.push({cat:item}) })

catag 是一个对象,JS 中对象的互相赋值都是对值的引用,所以每次修改的项 都是 同一个项的值,导致了前面被覆盖。

var a = {aa: 123};
var b = a;

b.aa = 456;
a // {aa: 456}

可以先浅拷贝一下

var categories = {0: "语种", 1: "风格", 2: "场景", 3: "情感", 4: "主题"};

var catlist = [];
for(let i in categories ){

var catag = {};
catag.cat = categories[i];
console.log(catag.cat);
catlist.push(catag);
console.log(catlist);             

}

啊,你这样写 catag 我初一看,一位是系统内置,后来发现原来不是。js 里面经常会遇到这种问题,为什么我改动之后,按照逻辑不应该如此,为什么会发生一次改动,之前也被改动了呢?这个关键在于 js 的特性了,我也不是很懂,但知道这个原因就行。因为 你通过 push 将 catag 放入 catlist ,所以,你放的不是 catag 的值,而是 catag 这个对象,所以,你每次在改变 catag 的时候,并且又没有重新定义它。所以在最后的时候你可以这样看:`catag = ['cat':'教育'];
catlist = [catag,catag,catag,catag]`
就是这么个原因。解决方法有多个,一直接 push 对应应对参数结果。或者像楼上那样,每次重定义 catag 变量。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题