immutable深拷贝:数据多层属性-不可变数据结构

这篇具有很好参考价值的文章主要介绍了immutable深拷贝:数据多层属性-不可变数据结构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、为何要用immutable深拷贝?

1.浅拷贝(浅复制)

//引用赋值-浅复制、浅拷贝

var obj={

    name:"溜溜球"

}

var obj2=obj;

obj2.name="刘刘球";

console.log(obj);//name:"刘刘球"

console.log(obj2);//name:"刘刘球"

2.object.assign()一级属性复制,比浅复制多赋值一层,不是真正的深复制

//比浅复制多赋值一层,不是真正的深复制

var myobj={

    name:"六六球",

    like:["打球","rapper"]

}

var myobj2={

    ...myobj

};

myobj2.name="66球";

myobj2.like.splice(0,1)

console.log(myobj);

console.log(myobj2);

immutable深拷贝:数据多层属性-不可变数据结构

3.const obj1 = JSON.parse(JSON.stringify(obj)); 数组,对象都好用的方法(缺点: 不能有undefined)

//json-parse json-stringify
var jsonobj={
    name:"遛遛",
    like:["下棋","swage"],
}
var jsonobj2=JSON.parse(JSON.stringify(jsonobj));
jsonobj2.name="66";
jsonobj2.like.splice(0,1);
console.log(jsonobj);
console.log(jsonobj2);

immutable深拷贝:数据多层属性-不可变数据结构

 有undefined时被丢弃

//json-parse json-stringify
var jsonobj={
    name:"遛遛",
    like:["下棋","swage"],
    age:undefined
}
var jsonobj2=JSON.parse(JSON.stringify(jsonobj));
jsonobj2.name="66";
jsonobj2.like.splice(0,1);
console.log(jsonobj);
console.log(jsonobj2);

immutable深拷贝:数据多层属性-不可变数据结构

Immutable 实现的原理是 Persistent Data Structure(持久化数据结构),也就是使用旧数据创建新数据时,要保证旧数据同时可用且不变。同时为了避免 deepCopy 把所有节点都复制一遍带来的性能损耗,Immutable 使用了 Structural Sharing(结构共享),即如果对象树中一个节点发生变化,只修改这个节点和受它影响的父节点,其它节点则进行共享 

二、使用

1.安装:npm install immutable

2.mmutable中常用类型(Map,List)

①Map(对象)

import React, { Component } from 'react';
import {Map} from 'immutable';
var obj={
    name:"六六",
    age:17
}
var oldImmuObj=Map(obj);
var newmmuObj=oldImmuObj.set( 'name',"66");
console.log(oldImmuObj,newmmuObj);
//1.get获取immutable
console.log(oldImmuObj.get('name'),newmmuObj.get('name'));
//2.immutable转为普通对象
console.log(oldImmuObj.toJS(),newmmuObj.toJS());

immutable深拷贝:数据多层属性-不可变数据结构

②List(数组)

import React, { Component } from 'react';
import { List } from 'immutable';

var list=List([1,2,3]);
var list2=list.push([4,5]);
var list3=list.unshift(0);
console.log(list.toJS(),list2.toJS(),list3.toJS());
//push, set, unshift or splice 都可以直接用,返回一个新的immutable对象

 toJS():将复杂对象转为普通对象

const deep = Map({ a: 1, b: 2, c: List([ 3, 4, 5 ]) });
console.log(deep.toObject()); // { a: 1, b: 2, c: List [ 3, 4, 5 ] }
console.log(deep.toArray()); // [ 1, 2, List [ 3, 4, 5 ] ]
console.log(deep.toJS()); // { a: 1, b: 2, c: [ 3, 4, 5 ] }
JSON.stringify(deep); // '{"a":1,"b":2,"c":[3,4,5]}'

③.map与list案例

1.复杂案例

import React, { Component } from 'react';
import { List,Map } from 'immutable';

class update extends Component {
    state={
        info:Map({
            name:"溜溜球",
            location:Map({
                provice:"四川",
                city:"成都"
            }),
            favor:List(["读书","看包","写代码"])
        })
    }
    render() {
        return (
            <div>
                <button onClick={()=>{
                    this.setState({
                        info:this.state.info.set("name","66球").set("location",this.state.info.get("location").set("provice","广东").set("city","深圳"))
                    })
                }}>修改</button>
                <div>{this.state.info.get("name")}</div>
                 <div>{this.state.info.get("location").get("provice")}-{this.state.info.get("location").get("city",)}</div>
                  <div> 
                    <ol>
                    {
                    this.state.info.get("favor").map((item,index)=>
                      <li key={item}>{item}<button onClick={()=>{
                        this.setState({
                            info:this.state.info.set("favor",this.state.info.get("favor").splice(index,1))
                        })
                      }}>删除</button></li>   
                    )
                    }
                    </ol>
                </div>
            </div>
        );
    }
}

export default update;

 2.fromJS()方法将普通对象转为复杂对象,自动加上List和Map.提供了获取方法getIn(),设置新值方法setIn(),回调函数更新updateIn().


const nested = fromJS({ a: { b: { c: [ 3, 4, 5 ] } } });
// Map { a: Map { b: Map { c: List [ 3, 4, 5 ] } } }
const nested2 = nested.mergeDeep({ a: { b: { d: 6 } } });
// Map { a: Map { b: Map { c: List [ 3, 4, 5 ], d: 6 } } }
console.log(nested2.getIn([ 'a', 'b', 'd' ])); // 6
//如果取一级属性 直接通过get方法,如果取多级属性 getIn(["a","b","c"]])
//setIn 设置新的值
const nested3 = nested2.setIn([ 'a', 'b', 'd' ], "kerwin");
// Map { a: Map { b: Map { c: List [ 3, 4, 5 ], d: "kerwin" } } }
//updateIn 回调函数更新

const nested3 = nested2.updateIn([ 'a', 'b', 'd' ], value => value + 1);
console.log(nested3);
// Map { a: Map { b: Map { c: List [ 3, 4, 5 ], d: 7 } } }
const nested4 = nested3.updateIn([ 'a', 'b', 'c' ], list => list.push(6));
// Map { a: Map { b: Map { c: List [ 3, 4, 5, 6 ], d: 7 } } }
文章来源地址https://www.toymoban.com/news/detail-463818.html

/*
 * @Author: Spring
 * @LastEditors: Aidam_Bo
 * @LastEditTime: 2023-05-29 17:26:15
 */
import React, { Component } from 'react';
import { fromJS} from 'immutable';

class update extends Component {
    state={
        info:fromJS({
            name:"溜溜球",
            location:{
                provice:"四川",
                city:"成都"
            },
            favor:["读书","看包","写代码"]
        })
    }
    
    componentDidMount() {
        console.log("fromJS",this.state.info);
    }
    
    render() {
        return (
            <div>
                <button onClick={()=>{
                    this.setState({
                        info:this.state.info.set("name","66球").setIn(["location","provice"],"广东").setIn(["location","city"],"深圳")
                    })
                }}>修改</button>
                <div>{this.state.info.get("name")}</div>
                 <div>{this.state.info.getIn(["location","provice"])}-{this.state.info.getIn(["location","city"])}</div>
                  <div> 
                    <ol>
                    {
                    this.state.info.get("favor").map((item,index)=>
                      <li key={item}>{item}<button onClick={()=>{
                        this.setState({
                            info:this.state.info.updateIn(["favor"],(list)=>list.splice(index,1))
                        })
                      }}>删除</button></li>   
                    )
                    }
                    </ol>
                </div>
            </div>
        );
    }
}

export default update;

到了这里,关于immutable深拷贝:数据多层属性-不可变数据结构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构与算法——数据结构有哪些,常用数据结构详解

    数据结构是学习数据存储方式的一门学科,那么,数据存储方式有哪几种呢?下面将对数据结构的学习内容做一个简要的总结。 数据结构大致包含以下几种存储结构: 线性表,还可细分为顺序表、链表、栈和队列; 树结构,包括普通树,二叉树,线索二叉树等; 图存储结构

    2024年02月15日
    浏览(60)
  • 算法 数据结构分类 数据结构类型介绍 数据结构线性非线性结构 算法合集 (一)

     数据结构分为:                            a.线性结构                            b.非线性结构  a.线性结构:                       数据与结构存在一对一的线性关系; a . 线性结构 存储 分为:                                   顺序存储

    2024年02月10日
    浏览(49)
  • 结构化数据、非结构化数据、半结构化数据

    结构化的数据一般是指可以使用关系型数据库表示和存储,可以用二维表来逻辑表达实现的数据。例如:需要多少个属性,每个属性什么类型,每个属性的取值范围等等,类似下图所示, 提前定义好了一个二维矩阵的元数据 ,包含有列名称、列的类型、列的约束等:   可见

    2024年02月09日
    浏览(62)
  • 【数据结构】何为数据结构。

    🚩 WRITE IN FRONT 🚩    🔎 介绍:\\\"謓泽\\\"正在路上朝着\\\"攻城狮\\\"方向\\\"前进四\\\" 🔎 🏅 荣誉:2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2022博客之星TOP100|TOP63、阿里云专家博主、掘金优秀创作者、全网粉丝量6w+、全网访问量100w+ 🏅 🆔 文章内容由 謓泽 原创 如需相关

    2024年02月08日
    浏览(60)
  • 【数据结构】什么是数据结构?

    🦄 个人主页 :修修修也 🎏 所属专栏 :数据结构 ⚙️ 操作环境 : Visual Studio 2022 目录 🎏数据结构的定义 🎏结语 数据结构(Data Structure)是计算机 存储 , 组织数据的方式 ,指 相互之间存在一种或多种特定关系的数据元素的集合 . 这么讲可能有些抽象,放一张图大家可能好理解一

    2024年02月07日
    浏览(50)
  • 【数据结构(一)】初识数据结构

    ❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵 关注我带你学更多数据结构知识 数据结构是计算机存储,组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合,从这篇文章开始,我们将一起进入数

    2024年04月09日
    浏览(56)
  • 数据结构和算法——数据结构

    目录 线性结构  队列结构的队列 链表结构的队列 链表的面试题 单向链表应用场景 约瑟夫环问题 栈结构 中缀表达式 前缀表达式 后缀表达式 非线性结构 图 递归解决迷宫问题 递归解决八皇后问题 顺序存储方式,顺序表 常见的顺序存储结构有:数组、队列、链表、栈 链式存

    2024年02月07日
    浏览(53)
  • 数据结构初探:揭开数据结构奥秘

    🌈个人主页: 聆风吟 🔥系列专栏: 数据结构、算法模板、汇编语言 🔖少年有梦不应止于心动,更要付诸行动。      💬 文章主要介绍:本系列主要对数据结构的进行由浅入深的讲解,希望对你今后的学习有一定的帮助。如果有发现错误的地方还请在评论区告知,非

    2024年02月02日
    浏览(51)
  • 【数据结构】数据结构中的栈

    该篇文章来了解数据结构中的 栈 ,栈与队列都为一种线性存储结构,同时栈与队列在逻辑结构上,都只能在头或者尾进行对数据的操作; 栈是一种 LIFO(Last in,First out)的结构 ,翻译过来即是 后进先出的一种结构 ;栈无论是出数据还是入数据都 只能从栈顶位置按顺序进行

    2024年02月05日
    浏览(48)
  • 数据结构(王道)——数据结构之 树

           树的概念补充: 结点之间的关系描述    结点、树的属性描述: 有序树、无序树: 1、第i层至多有m^(i-1)个结点 2、高度为h的m叉树至多有(m^h-1)/(m-1)个结点   3、高度为h的m叉树至少有h个结点 高度为h,度为m的树至少有h+m-1个结点   4、具有n个结点的m叉树的最小高度

    2024年02月17日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包