平時我們在處理純粹物件(鍵值對物件/json)時,如果使用object.assign或者物件解構賦值,只會合併第一層的資料,而當合併巢狀物件,將會直接覆蓋掉前面被合併物件裡的資料,這是因為object.assign和物件解構賦值都是只有第一層屬於深拷貝,而往下都是淺拷貝,例如:
var obj1 =};
var obj2 =};
var obj3 =
;// object.assign
object.
assign
(obj3, obj1, obj2)
;console.
log(obj3)
;// }
// 解構
obj3 =
;console.
log(obj3)
;// }
可以看到,obj1裡面的a屬性被覆蓋了,直接替換成了最後乙個物件(obj2)裡的a,即: 。
// 判斷是否是純粹物件
const
isplainobject
= obj =>
// 主函式
function
assigndeep()
for(
let key in item)
else}}
else
if(item instanceof
array
)else})
}})return result;
}
var obj1 =};
var obj2 =};
var obj3 =
;// 呼叫assigndeep方法
assigndeep
(obj3, obj1, obj2)
;console.
log(obj3)
;// }
var obj4 =};
var obj5 =};
assigndeep
(obj4,obj5)
;// };
var obj6 =[1
,2,3
];var obj7 =[4
,5];
assigndeep
(obj6, obj7)
;// [4,5,3]
assigndeep()方法可以解決多數常用資料型別(包括陣列)的物件的賦值合併操作 js物件深度拷貝
js中物件是引用資料型別,如果我們只是簡單的把物件a通過等號複製給物件b,那麼物件a b指向的還是同乙個位址,這是改變a,b也會跟著改變。var a var b a b.a 2 console.log a.a 2這並不是我們想要看到的,一般我們想要的拷貝乙個物件就是想要相互不影響兩個物件。也就是深度...
js進行物件深度拷貝deep clone
推薦 操作新穎,逆向思維 轉成json字串 在將字串轉為物件 obj1 let obj3 json.parse json.stringify obj1 obj1.a 4 obj1.b.c 4 log json.stringify obj3 慎用lodash的clonedeep函式 文中還是推薦方法一...
js實現深度拷貝
js實現拷貝,使用普通賦值物件,在操作其中乙個物件值的時候,另乙個也會更改,不符合需求 因此引入深度拷貝,以下為實現深度拷貝的幾種法 合併多個物件 var target var source1 var source2 object.assign target,source1,source2 注意 這...