鍍金池/ 問(wèn)答/HTML/ 一個(gè)對(duì)象轉(zhuǎn)為數(shù)組對(duì)象

一個(gè)對(duì)象轉(zhuǎn)為數(shù)組對(duì)象

預(yù)期:

categories:{0: "語(yǔ)種", 1: "風(fēng)格", 2: "場(chǎng)景", 3: "情感", 4: "主題"}

轉(zhuǎn)為

catlist= [{cat: "語(yǔ)種"}{cat: "風(fēng)格"}{cat: "場(chǎng)景"}{cat: "情感"}{cat: "主題"}]

實(shí)際

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

實(shí)在是不知道為什么,為什么循環(huán)數(shù)組push會(huì)更改前面push的值

回答
編輯回答
哎呦喂

catag 是一個(gè)對(duì)象,JS 中對(duì)象的互相賦值都是對(duì)值的引用,所以每次修改的項(xiàng) 都是 同一個(gè)項(xiàng)的值,導(dǎo)致了前面被覆蓋。

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

b.aa = 456;
a // {aa: 456}
2018年1月31日 16:18
編輯回答
懷中人

let categories={0: "語(yǔ)種", 1: "風(fēng)格", 2: "場(chǎng)景", 3: "情感", 4: "主題"}, catlist=[]; Object.values(categories).map((item)=>{ catlist.push({cat:item}) })

2018年4月4日 16:53
編輯回答
礙你眼

var categories = {0: "語(yǔ)種", 1: "風(fēng)格", 2: "場(chǎng)景", 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);             

}

2017年4月30日 11:33
編輯回答
淚染裳

可以先淺拷貝一下

2018年8月31日 03:36
編輯回答
不舍棄

啊,你這樣寫(xiě) catag 我初一看,一位是系統(tǒng)內(nèi)置,后來(lái)發(fā)現(xiàn)原來(lái)不是。js 里面經(jīng)常會(huì)遇到這種問(wèn)題,為什么我改動(dòng)之后,按照邏輯不應(yīng)該如此,為什么會(huì)發(fā)生一次改動(dòng),之前也被改動(dòng)了呢?這個(gè)關(guān)鍵在于 js 的特性了,我也不是很懂,但知道這個(gè)原因就行。因?yàn)?你通過(guò) push 將 catag 放入 catlist ,所以,你放的不是 catag 的值,而是 catag 這個(gè)對(duì)象,所以,你每次在改變 catag 的時(shí)候,并且又沒(méi)有重新定義它。所以在最后的時(shí)候你可以這樣看:`catag = ['cat':'教育'];
catlist = [catag,catag,catag,catag]`
就是這么個(gè)原因。解決方法有多個(gè),一直接 push 對(duì)應(yīng)應(yīng)對(duì)參數(shù)結(jié)果?;蛘呦駱巧夏菢?,每次重定義 catag 變量。

2018年5月25日 12:18
編輯回答
失魂人

因?yàn)槟氵@個(gè)catag沒(méi)有重新定義,都是指向同一個(gè)引用,你要在循環(huán)里面每次重新定義一個(gè),或者直接push

for (let i in categories) {
  catlist.push({cat: categories[i]})
}
2018年3月10日 18:24
編輯回答
拼未來(lái)

簡(jiǎn)單,因?yàn)槟愕腸atag的地址沒(méi)變過(guò),你每一次循環(huán)都是改的同一個(gè)catag的值,然后把同一個(gè)catag插入到數(shù)組中。
而不是你猜測(cè)的數(shù)組push會(huì)更改前面push的值。
改成這樣:

for(let i in categories ){
    const catag={}
    catag.cat = categories[i];
    catlist.push(catag);
    console.log(catlist);             
}
2017年1月13日 13:22