介绍

根据模板,自动对一个 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进阶】Day05:窗口函数

    〇.概述 一.专用窗口函数 1.每类试卷得分前3名 自己写出来的部分 SELECT tag AS tid, uid AS uid, Rank AS ranking -- 如何确定排名 FROM exa ...

  2. Jmeter 函数助手之__UUID 生成唯一的标识符

    在测试ws协议接口时,常常需要传入唯一标识符,jmeter 提供__UUID.__Random生成随机的字符串,两者区别为:__UUID生成的随机字符串不会重复,而__Random会重复 __UUID ...

  3. 2021强网杯青少赛(qwtac)楼上大佬ddw WriteUp

    楼上大佬ddw战队WRITEUP 战队信息 战队名称:楼上大佬ddw 战队排名:24 解题情况 解题过程 01 签到 操作内容: 下载附件,打开运行拿到flag 如该题使用自己编写的脚本代码请详细写出 ...

  4. [深度学习] tf.keras入门3-回归

    目录 波士顿房价数据集 数据集 数据归一化 模型训练和预测 模型建立和训练 模型预测 总结 回归主要基于波士顿房价数据库进行建模,官方文档地址为:https://tensorflow.google.c ...

  5. [WPF]数据绑定Demo

    目录 1.View模型代码 2.ViewModel模型代码 3.数据模型 4.样例演示 5.一些知识点 这里简单实现一个listbox绑定的功能,符合MVVM模型. View模型代码(View视图以及 ...

  6. Miller-Rabin 与 Pollard-Rho 算法学习笔记

    前言 Miller-Rabin 算法用于判断一个数 \(p\) 是否是质数,若选定 \(w\) 个数进行判断,那么正确率约是 \(1-\frac{1}{4^w}\) ,时间复杂度为 \(O(\log ...

  7. 在GCP上创建GCE的三种方式(Console,gcloud,Terraform)

    1 简介 如果要选择GCP为云平台,则经常需要创建GCE(Google Compute Engine),有以下几种方式: (1) 在浏览器创建 (2) 命令 gcloud (3) Terraform ...

  8. vulnhub靶场之VULNCMS: 1

    准备: 攻击机:虚拟机kali.本机win10. 靶机:VulnCMS: 1,下载地址:https://download.vulnhub.com/vulncms/VulnCMS.ova,下载后直接vb ...

  9. 洛谷P3654 First Step题解

    这是一道暴力枚举. 大致题意:R行C列的棋盘要放下长度为K的线段,"#"表示无法放置,问有多少种放置方法. 直接贴代码: #include<bits/stdc++.h> ...

  10. Linux三剑客日志处理系列

    三剑客日志处理系列 一.特殊符号 1.引号系列 必会 引号 含义 单引号 所见即所得,单引号里的内容会原封不动输出 双引号 和单引号类似,对双引号里面的特殊符号进行解析,对于{}花括号(通配符)没有解 ...