refactorObjProps:裁剪、添加对象字段或更新字段内容
介绍
根据模板,自动对一个 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:裁剪、添加对象字段或更新字段内容的更多相关文章
- MySQL批量更新字段url链接中的域名
1. 首先进行数据库备份 2. SQL语句 UPDATE 表名 SET 字段 = REPLACE(字段, '待更新的内容','替换值'); eg: UPDATE 98k_images SET url ...
- Spring boot Jpa添加对象字段使用数据库默认值
Spring boot Jpa添加对象字段使用数据库默认值 jpa做持久层框架,项目中数据库字段有默认值和非空约束,这样在保存对象是必须保存一个完整的对象,但在开发中我们往往只是先保存部分特殊的字段其 ...
- access数据库用sql语句添加字段,修改字段,删除字段
用 Create Table 建立一个表 Table1 ,主键是自动编号字段,另一个字段是长度是 10 的文本字段. 代码如下:CREATE TABLE Table1 (Id COUNTER CONS ...
- 开发笔记:基于EntityFramework.Extended用EF实现指定字段的更新
今天在将一个项目中使用存储过程的遗留代码迁移至新的架构时,遇到了一个问题——如何用EF实现数据库中指定字段的更新(根据UserId更新Users表中的FaceUrl与AvatarUrl字段)? 原先调 ...
- SQL 查询分析器操作(修改、添加、删除)表及字段等
一.库操作1..创建数据库命令:create database <数据库名>例如:建立一个名为xhkdb的数据库mysql> create database xhkdb; 2.显示所 ...
- 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 ...
- thinkphp---数据表更新字段开发模式可更新生产模式不能更新!
这里认为是坑的主要原因:这个问题我调试了一天,才发现是缓存的问题. 问题原因:在做一thinkphp的项目,在后期要进行修改.修改的时候,数据表里面添加了两个字段,然后前台修改模板,将添加的字段提交上 ...
- 【开发者笔记】按List中存放对象的某一字段计数的问题
如题,假设有如下表t_info: name date info a 20127-12-20 xxxx描述 b 20127-12-20 yyyyy描述 c 20127-12-21 zzz描述 d 201 ...
- 关于EntityFramework 更新数据记录时字段全部更新问题和不从数据库中获取直接更新记录
一.一直对这个比较疑惑感觉只修改一条数据记录的一个字段结果更新Savechages后跟踪生成sql竟然是全部被修改,感觉微软怎么这么傻,总觉得会有其它方式可以只更新部分字段,但一直没有找到相关设置,最 ...
- SQL存在一个表而不在另一个表中的数据, 更新字段为随机时间
--更新字段为随机时间 86400秒=1天 UPDATE dl_robot ), ,GETDATE()) ) SQL存在一个表而不在另一个表中的数据 方法一 使用 not in ,容易理解,效 ...
随机推荐
- 3.5:基于Python的KNN算法简单实现
〇.目标 1.使用pycharm工具创建项目demo: 2.使用python语言实现KNN算法. 一.创建脚本文件 二.编写KNN算法程序 KNN算法所阐述的核心思想在KNN.py文件的注释部分具有详 ...
- 2.9:数据交换-csv、Excel、json、爬虫、Tushare获取数据
〇.任务 1. 使用Python基础文件读写函数完成CSV文件的处理: 2. 使用标准CSV库完成CSV文件的处理: 3. 使用Excel库完成Excel文件的处理: 4. Python数据结构和Js ...
- .net core 中 WebApiClientCore的使用
WebApiClient 接口注册与选项 1 配置文件中配置HttpApiOptions选项 配置示例 "IUserApi": { "HttpHost": &q ...
- 《HTTP权威指南》– 9.识别和认证
客户端识别与Cookie机制 承载用户相关信息的HTTP首部 From Email地址 User-Agent 浏览器软件 Referer 跳转链接<来自> Author ziation 用 ...
- angr原理与实践(三)——Arbiter:一种弥合二进制程序漏洞发现中的静态和动态鸿沟
转载请说明出处:信安科研人 please subscribe my official wechat :信安科研人 获取更多安全资讯 原文链接:sec22-vadayath.pdf (usenix. ...
- RuntimeError: setuptools >= 41 required to build
使用命令python setup.py install 安装第三方库报RuntimeError: setuptools >= 41 required to build 原因setuptools版 ...
- git相关问题解析,你想要的都有🔥
官网文档: https://git-scm.com/doc 本地克隆远程代码仓库 git clone 地址 本地同步全量历史数据,克隆所有文件的历史记录 git clone 地址 -depth 1 本 ...
- 红袖添香,绝代妖娆,Ruby语言基础入门教程之Ruby3基础语法,第一次亲密接触EP01
书接上回,前一篇我们在全平台构建好了Ruby3的开发环境,现在,可以和Ruby3第一次亲密接触了. Ruby是一门在面向对象层面无所不用其极的解释型编程语言. 我们可以把编写Ruby代码看作是一场行为 ...
- CVE-2020-1938与CVE-2020-13935漏洞复现
前言 最近在腾讯云上买了个服务器,准备用来学习.在安装了7.0.76的tomcat后,腾讯云提醒我存在两个漏洞,分别是CVE-2020-1938和CVE-2020-13935,在修复完漏洞后,准备复现 ...
- 【转载】C#使用Dotfuscator混淆代码以及加密
C#编写的代码如果不进行一定程度的混淆和加密,那么是非常容易被反编译进行破解的,特别是对于一些商业用途的C#软件来说,因为盯着的人多,更是极易被攻破.使用Dotfuscator可以实现混淆代码.变量名 ...