在减速器中,我们总是使用Object.assign({},state,newState)
来保存状态。但assign()
不支持深度复制,因为此方法仅复制多级对象的引用。这是我在程序中的代码。
const menuListState={
menuList: {},
menuListLoading:false
}
function getMenuList(state=menuListState,action=defaultAction){
switch(action.type){
//menuList begin
case actions.GET_MENULIST_SUCCESS:
return Object.assign({},state,{
menuList:action.data,
menuListLoading:false
});
default:
return state;
}
}

属性menuList
是一个多级对象。当action.data
发生变化时,state.menuList
会在方法assign()
工作之前立即更改吗?
答案 0 :(得分:10)
您可以使用JSON.stringify对对象进行字符串化,并使用JSON.parse将结果字符串解析为对象,您将获得与要深度复制的对象相同的新对象。
当时的选票是什么?
答案 1 :(得分:6)
您可能对cloneDeep表单lodash感兴趣,使用如下:
var objects = [{ 'a': 1 }, { 'b': 2 }];
var deep = _.cloneDeep(objects);
console.log(deep[0] === objects[0]);
// => false
答案 2 :(得分:1)
对此线程非常感兴趣。这里是我对chrome的粗略介绍。 largeObj约为15,000个字符
let i, t = new Date().getTime();
for(i=0;i<1000;i++) cloneDeep(largeObj)
console.log('clone', new Date().getTime() - t);
t = new Date().getTime();
for(i=0;i<1000;i++) JSON.parse(JSON.stringify(largeObj));
console.log('JSON', new Date().getTime() - t);
以下是我的结果。 “克隆”赢了
clone 46
JSON 82
clone 42
JSON 87
clone 45
JSON 87
clone 46
JSON 85
clone 44
JSON 86
答案 3 :(得分:0)
如果C_B
是引用类型(对象,数组,...),当您更改mat_c
时,$str="Friday September 09, 2016 7:00 pm - 8:00 pm";
$str_date= explode("-",$str);
$date=strtotime($str_date[0]);
$result = '<div>' . date("l F j, Y ",trim($date)) . '<span>' . date("h:i A",trim($date))." - ".$str_date[1] . '</span></div>';
echo $result;
会立即更改,因为它们引用了相同的值。这只是Javascript的正常功能。
答案 4 :(得分:0)
您可以执行JSON序列化
var clone = JSON.parse(JSON.stringify(oldObjCopy));
但是,不建议这样做,
您可能会丢失任何Javascript,JSON属性,例如Function
或undefined
。这些属性会被JSON.stringify
忽略,从而导致它们在克隆对象上丢失。
Date
个对象结果成为string
。
相反,您可以使用最简单的Lodash
import cloneDeep from 'lodash/cloneDeep';
var clone = cloneDeep(oldObjCopy);