React中的Deepcopy

Thi*_*Sun 9 javascript reactjs redux

在减速器中,我们总是Object.assign({},state,newState)用来保存状态.但是assign()不支持deepcopy,因为这种方法只复制多级对象的引用.这是我在程序中的代码.

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;
	}
}
Run Code Online (Sandbox Code Playgroud)

该属性menuList是一个多级对象.而当action.data改变时,会state.menuList在方法assign()工作之前立即改变吗?

pas*_*ion 10

您可以使用JSON.stringify对对象进行字符串化,并使用JSON.parse将结果字符串解析为对象,您将获得与要深度复制的对象相同的新对象.

当时的票数是多少?

  • 仅当您的对象不包含:“日期、函数、未定义、Infinity、RegExps、Maps、Sets、Blob、FileLists、ImageDatas、稀疏数组、类型化数组或其他复杂类型”时,此方法才有效。请参阅 https://stackoverflow.com/ a/122704/5815054。否则使用一些链接“lodash.clonedeep”,请参阅其他答案。 (3认同)

Jem*_*nes 6

您可能对cloneDeep形式lodash 感兴趣,用法如下:

var objects = [{ 'a': 1 }, { 'b': 2 }];

var deep = _.cloneDeep(objects);
console.log(deep[0] === objects[0]);
// => false
Run Code Online (Sandbox Code Playgroud)

这就是该方法的npm包。