React中的Deepcopy

时间:2016-08-31 04:57:34

标签: javascript reactjs redux

在减速器中,我们总是使用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()工作之前立即更改吗?

5 个答案:

答案 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

Heres the npm package for just that method.

答案 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属性,例如Functionundefined。这些属性会被JSON.stringify忽略,从而导致它们在克隆对象上丢失。 Date个对象结果成为string。 相反,您可以使用最简单的Lodash

import cloneDeep from 'lodash/cloneDeep';
var clone = cloneDeep(oldObjCopy);