patch需要数据格式前端算法,patch算法基础,两个对象对比取差异属性
在我们的前端开发过程中,表单是最常见不过的了,一般我们创建表单的时候习惯使用post方法来提交数据,编辑表单时候喜欢put,但是当表单的数据非常多的时候,编辑起来很麻烦,首先需要获取初始化数据,然后把修改后的表单数据全部提交给后台,可能出现下面的情况:
form ={
name:'fei',
age:20,
like:[1,2,3],
do:{
job:'IT'
}
}
修改后的数据如下
form ={
name:'fei',
age:35,//仅仅修改这里
like:[1,2,3],
do:{
job:'IT'
}
}
我们仅仅修改了age这个属性,但是在提交的时候却需要提交所有的信息,包括之前完全没有修改的数据,这会造成一种浪费。所以经常有时候 我们在编辑表单的时候,采用了patch方法,当然这也是需要后端的支持的,实现这个方法的的表单修改,参照上面的例子,我给后端传递的数据就是r如下:
form ={
age:35,//仅仅修改这里
}
那么表单的数据差异如何算出来呢,这就需要我们实现一套算法,来得出两次数据的差异,我们要做的就是对比两个对象,得到差异的属性,那么我们可以实现一个新的对象和一个旧对象的比较。在新对象中,和旧对象完全相同的属性我们使用delete去掉。首先我们定义一个对象叫patchCompare:
let patchCompare = {}
一般提交给后端的都是json格式,也就是对象,那么对象的属性可能分为如下几种常见的情况,
1.基本数据类型,列入数字,字符串,布尔...
2.对象
3.数组
所以首先我们需要判断该属性是什么类型的方法
patchCompare.isArray = function( arr ){
return Object.prototype.toString.call( arr ) === '[object Array]'
}
patchCompare.isObject = function( obj ){
return Object.prototype.toString.call( obj ) === '[object Object]'
}
接下来我们还需要一个方法用于判断我们的对象是否为空
patchCompare.isEmptyObj = function( obj ){
for( var i in obj ){
return false
}
return true;
}
然后我们数组的比较也比较特殊,因为:
let arr = [1,2,3]
let arr2 = [1,2,3] arr === arr2 //false
所以需要实现一个方法来对比数组内数值是否完全相同
patchCompare.isSimiliarArr = function( arr1, arr2 ){
if( arr1.length !== arr2.length ){
return false;
}
for( var i = 0; i < arr1.length; i++ ){
if( JSON.stringify( arr1[ i ] ) !== JSON.stringify( arr2[ i ] ) ){
return false;
}
}
return true;
}
下面就要实现我们真正对比算法了
/**
* modify 修改后的数据
* compareData 修改前的老数据
* parentObj 是否存在父节点
* key 当前对比数据在父节中的属性
*/
directObj.compare = function( modify, compareData, parentObj, key ){
for ( var i in modify ){
//新的不存在了,老的存在的属性TODO....
if( !directObj.isObject( modify[ i ] ) && directObj.isObject( compareData[ i ] ) ){ }
//对象 递归调用
else if( directObj.isObject( modify[ i ] ) ){
directObj.compare( modify[ i ], compareData[ i ], modify, i )
}//数组
else if( directObj.isArray( modify[ i ] ) ){
if( directObj.isSimiliarArr( modify[ i ], compareData[ i ] ) ){
delete modify[ i ]
}
}//其他
else{
if( modify[ i ] === compareData[ i ] ){
delete modify[ i ]
}
}
}
//要是有父属性,并且该对象是空对象,那么删除该属性
/*obj={
name:'fei',
like:{},//该属性需要从obj内删除,
}*/
if( parentObj && key && directObj.isEmptyObj( modify ) ){
delete parentObj[ key ]
}
}
在我项目中,我们是基于vue+iview写的,我们单独为这个方法写了指令,便于得到需要的结果,需要的可以给我留言
patch需要数据格式前端算法,patch算法基础,两个对象对比取差异属性的更多相关文章
- 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础
---layout: posttitle: 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础key: 20180203tags: 机器学习 ML IRIS python3mo ...
- Java面试题总结之数据结构、算法和计算机基础(刘小牛和丝音的爱情故事1)
Java面试题总结之数据结构.算法和计算机基础(刘小牛和丝音的爱情故事1)mp.weixin.qq.com 全文字数: 1703 阅读时间: 大约6 分钟 刘小牛是一名Java程序员,由于天天9 ...
- 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority queue)
堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...
- 算法与数据结构基础 - 广度优先搜索(BFS)
BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...
- 算法与数据结构基础 - 哈希表(Hash Table)
Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O( ...
- 算法与数据结构基础 - 二叉树(Binary Tree)
二叉树基础 满足这样性质的树称为二叉树:空树或节点最多有两个子树,称为左子树.右子树, 左右子树节点同样最多有两个子树. 二叉树是递归定义的,因而常用递归/DFS的思想处理二叉树相关问题,例如Leet ...
- 算法与数据结构基础 - 分治法(Divide and Conquer)
分治法基础 分治法(Divide and Conquer)顾名思义,思想核心是将问题拆分为子问题,对子问题求解.最终合并结果,分治法用伪代码表示如下: function f(input x size ...
- 算法与数据结构基础 - 双指针(Two Pointers)
双指针基础 双指针(Two Pointers)是面对数组.链表结构的一种处理技巧.这里“指针”是泛指,不但包括通常意义上的指针,还包括索引.迭代器等可用于遍历的游标. 同方向指针 设定两个指针.从头往 ...
- 算法与数据结构基础 - 贪心(Greedy)
贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...
随机推荐
- arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf的区别
转自 https://www.cnblogs.com/linuxbo/p/4297680.html 命名规则 交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eab ...
- Unity3d学习日记(一)
闲来无事开始自学unity3d,发现还挺容易入门的,添加资源文件以及用c#编写脚本都很方便. 前面在Unity官方教程上自学了一段时间,跟着教程写了个space_shooter的小游戏,虽然游 ...
- 数据存储到MySQL并返回新插入的id值
当对数据库进行插入数据后,有时会需要刚插入的数据的id值,以作他用,整理如下: conn = pymysql.connect(, user=DB_USER, passwd=DB_PASSWORD, d ...
- [STL] vector基本用法
vector的数据安排以及操作方式,与array非常相似.两者的唯一区别在于空间的运用的灵活性.array是静态空间,一旦配置了就不能改变.vector是动态空间,随着元素的加入,它的内部机制会自行扩 ...
- bzoj3473字符串&bzoj3277串
题意:给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串.注意本质相同的子串多次出现算多次,如1 1 aaa这组数据答案为6,贡献1WA.代码里有些部分是为了 ...
- (六)Redis有序集合Sorted set操作
Sorted set全部命令如下: zadd key score1 member1 score2 member2 ... # 将一个或多个member元素及其score值加入到有序集合key当中 z ...
- [洛谷P4430]小猴打架
题目大意:有$n$个点,问有多少种连成生成树的方案. 题解:根据$prufer$序列可得,$n$个点的生成树有$n^{n-2}$个,每种生成树有$(n-1)!$种生成方案,所以答案是$n^{n-2}( ...
- cf1073d Berland Fair
~~~题面~~~ 题解: 可以发现,每走完一圈付的钱和买的数量是有周期性的,即如果没有因为缺钱而买不起某家店的东西,那么这一圈的所以决策将会和上一圈相同,这个应该是很好理解的,想想就好了. 因为钱数固 ...
- LOJ6388:[THUPC2018]赛艇——题解
https://loj.ac/problem/6388 如果你做过BZOJ5217:[Lydsy2017省队十连测]航海舰队的话,那么恭喜你,这道题就是大水题. 如果你做过BZOJ4259:残缺的字符 ...
- BZOJ3542 DZY Loves March 【map + 线段树】
题目链接 BZOJ3542 题解 线段树裸题,,对每一行每一列开线段树 由于坐标很大,用\(map\)维护根下标 化一下式子,只用维护区间和,区间平方和,区间存在的个数 #include<alg ...