介绍

根据模板,自动对一个 JS 对象的字段进行裁剪、添加或更新字段类型。

比如,做一个设置功能,其设置的数据(对象)存储在 localStorage 中。如果对象的字段名称更新了、或增加了一个新的字段、又或者字段的类型变更了,那么 localStorage 存储的对象可能会多出一些旧的(不需要的)字段。打开 F12 清除 localStorage,又会丢失上次设置的数据。

在保证其他字段不变化的情况下,对要变更的字段进行裁剪、添加或更新字段类型,refactorObjectProperties 就派上用场了。

演示效果

// 定义一个模板
const settingTempl = {
themeMode: "dark",
themeColor: "#409eff",
openToolKits: true,
githubPostion: "left",
openPager: false,
contentWidth: 50,
cabinet: {
left: 0,
right: 0,
break: false,
remote: true,
pinLeft: false,
pinRight: false,
width: 17.5
},
// localStorage 中缺少 background 字段,使用 refactorObjectProperties 之后就会自动添加该字段到 localStorage 的对象中,且不影响上面其他字段,也不需要清除 localStorage。
background: {
filter: 6,
src: ""
}
}; // 获取 localStorage 存储的对象
const store = JSON.parse(localStorage.getItem('setting'));
// 对比模板,裁剪、添加对象字段或更新字段内容
const newStore = refactorObjProps(store, settingTempl);
// 重新存储到 localStorage 中,不影响没有变化的字段
localStorage.setItem('setting', JSON.stringify(newStore));

函数实现

/**
* 对一个对象的字段进行裁剪或添加
*
* @param source 要被裁剪或添加字段的对象
* @param template 一个对象,根据该模板(对象)对 source 进行裁剪或添加字段
* @returns
*/
export function refactorObjProps(source, template) {
if (!source) source = template;
const sourceKeys = Object.keys(source);
const templateKeys = Object.keys(template); if (sourceKeys.length !== templateKeys.length) {
if (sourceKeys.length > templateKeys.length) {
sourceKeys.forEach(sourceKey => {
const nonentity = templateKeys.find(templateKey => templateKey === sourceKey);
if (!nonentity) Reflect.deleteProperty(source, sourceKey);
});
} else if (sourceKeys.length < templateKeys.length) {
templateKeys.forEach(templateKey => {
const nonentity = sourceKeys.find(sourceKey => templateKey === sourceKey);
if (!nonentity) source[templateKey] = template[templateKey];
else {
if (typeof template[templateKey] === "object") {
refactorObjProps(source[templateKey], template[templateKey]);
}
}
});
}
} else {
templateKeys.forEach(templateKey => {
if (typeof template[templateKey] === "object") {
if (typeof source[templateKey] !== "object" || !source[templateKey]) {
source[templateKey] = template[templateKey];
}
refactorObjProps(source[templateKey], template[templateKey]);
} else if (typeof template[templateKey] !== "object") {
if (typeof source[templateKey] === "object") source[templateKey] = template[templateKey];
}
});
}
return source;
}

refactorObjProps:裁剪、添加对象字段或更新字段内容的更多相关文章

  1. MySQL批量更新字段url链接中的域名

    1. 首先进行数据库备份 2. SQL语句 UPDATE 表名 SET 字段 = REPLACE(字段, '待更新的内容','替换值'); eg: UPDATE 98k_images SET url ...

  2. Spring boot Jpa添加对象字段使用数据库默认值

    Spring boot Jpa添加对象字段使用数据库默认值 jpa做持久层框架,项目中数据库字段有默认值和非空约束,这样在保存对象是必须保存一个完整的对象,但在开发中我们往往只是先保存部分特殊的字段其 ...

  3. access数据库用sql语句添加字段,修改字段,删除字段

    用 Create Table 建立一个表 Table1 ,主键是自动编号字段,另一个字段是长度是 10 的文本字段. 代码如下:CREATE TABLE Table1 (Id COUNTER CONS ...

  4. 开发笔记:基于EntityFramework.Extended用EF实现指定字段的更新

    今天在将一个项目中使用存储过程的遗留代码迁移至新的架构时,遇到了一个问题——如何用EF实现数据库中指定字段的更新(根据UserId更新Users表中的FaceUrl与AvatarUrl字段)? 原先调 ...

  5. SQL 查询分析器操作(修改、添加、删除)表及字段等

    一.库操作1..创建数据库命令:create database <数据库名>例如:建立一个名为xhkdb的数据库mysql> create database xhkdb; 2.显示所 ...

  6. table的复制 SqlServer 数据库添加临时表(select 字段1,字段2,字段3 into)

    select  字段1,字段2,字段3 into tempname  form  table  where table.id=1; oralce : insert into MID_DRUG_DETA ...

  7. thinkphp---数据表更新字段开发模式可更新生产模式不能更新!

    这里认为是坑的主要原因:这个问题我调试了一天,才发现是缓存的问题. 问题原因:在做一thinkphp的项目,在后期要进行修改.修改的时候,数据表里面添加了两个字段,然后前台修改模板,将添加的字段提交上 ...

  8. 【开发者笔记】按List中存放对象的某一字段计数的问题

    如题,假设有如下表t_info: name date info a 20127-12-20 xxxx描述 b 20127-12-20 yyyyy描述 c 20127-12-21 zzz描述 d 201 ...

  9. 关于EntityFramework 更新数据记录时字段全部更新问题和不从数据库中获取直接更新记录

    一.一直对这个比较疑惑感觉只修改一条数据记录的一个字段结果更新Savechages后跟踪生成sql竟然是全部被修改,感觉微软怎么这么傻,总觉得会有其它方式可以只更新部分字段,但一直没有找到相关设置,最 ...

  10. SQL存在一个表而不在另一个表中的数据, 更新字段为随机时间

    --更新字段为随机时间 86400秒=1天 UPDATE dl_robot ), ,GETDATE()) )   SQL存在一个表而不在另一个表中的数据   方法一 使用 not in ,容易理解,效 ...

随机推荐

  1. 【SQL知识】SQL中的join操作总结:内连接、外连接(左右全)

    一.含义 基于表之间的共同字段,把来自两个或多个表的行结合起来 二.分类 内连接:join / inner join 外连接:left join / right join / full outer j ...

  2. 【每日一题】【上右下左模拟&while循环体条件不满足时】54.螺旋矩阵-211110/220204

    给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素. 解答:while循环内部不满足也会继续走到结尾 import java.util.ArrayList; ...

  3. [FCC] Cash Register 计算找零

    题目地址: https://chinese.freecodecamp.org/learn/javascript-algorithms-and-data-structures/javascript-al ...

  4. 个人电脑公网IPv6配置

    一.前言 自己当时以低价买的阿里ECS云服务器马上要过期了,对于搭建个人博客.NAS这样服务器的需求购买ECS服务器成本太高了,刚好家里有台小型的桌面式笔记本,考虑用作服务器,但是公网IPv4的地址实 ...

  5. RuntimeError: setuptools >= 41 required to build

    使用命令python setup.py install 安装第三方库报RuntimeError: setuptools >= 41 required to build 原因setuptools版 ...

  6. [python]《Python编程快速上手:让繁琐工作自动化》学习笔记1

    1. 模式匹配与正则表达式笔记(第7章)(代码下载) 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念. ...

  7. python之路47 django路由层配置 虚拟环境

    可视化界面之数据增删改查 针对数据对象主键字段的获取可以使用更加方便的obj.pk获取 在模型类中定义双下str方法可以在数据对象被执行打印操作的时候方便的查看 ''' form表单中能够触发提交动作 ...

  8. Java 进阶P-3.5+P-3.6

    对象数组的for-each循环 for-each是用于遍历数组的另一种形式的for循环.for-each循环显着减少了代码,并且循环中没有使用索引或计数器. 句法: For(<数组/列表的数据类 ...

  9. 【随笔记】MFC 解决按下 ESC、Enter 键会自动退出的问题

    网上大部分人的做法是通过拦截按键消息来屏蔽,实际正确的做法是: 1. 在对话框头文件重载 OnOK()(回车会触发) 和 OnCancel()(ESC会触发) 函数. // XXXXXXXDlg.h ...

  10. 阿里百秀后台管理项目笔记 ---- Day04

    来吧展示: step 1 : 实现评论管理数据渲染 利用 ajax 创建接口得到数据使用模板引擎渲染页面 1.1 引入文件 <script src="/static/assets/ve ...