重点申明一下, 这个方法 只限于两个完全一样的对象 ,不一样的对象请使用 下面的进行合并,
<script>
let form = {name: 'liming', sex: '男'};
let obj = {class: '一班', age: 15};
console.log('before', form);
Object.assign(form, obj); //该方法可以完成
console.log('after', form);
</script>
话不多说, js基础比较差, 所以记录一下
使用递归的思想进行合并,
/**
* 一个json对象 中可以有 jsonObject 也可以有 sonArray
* 该方法最终将sourceJson 与targetJson 合并, 最终以target为主体,限于两个相同对象 ,不同对象用OBject.ass...
* 例如: sA={a:null,b:2,c:3}; tA={a:11,b:null,c:33}; 得到{a:11,b:2,c:33}
* @param sourceJson
* @param targetJson
*/
function merge2(sourceJson, targetJson) {
var resultJson = {};
resultJson = targetJson;
for (var sattr in sourceJson) {
for (var tattr in targetJson) {
if (sattr.toString() == tattr.toString()) {
var sourceStr = JSON.stringify(sourceJson[sattr]);
var targetStr = JSON.stringify(targetJson[tattr]);
// 只需判断source即可, target即便有值, 递归过程中也不会覆盖
if (sourceStr.lastIndexOf('}') > 0 && sourceJson[sattr].constructor == Object) {
// 如果该属性下还有对象, 那就递归合并,直到该属性不为对象,最终修改结果为target
merge2(sourceJson[sattr], targetJson[tattr]);
}
//如果是 jsonarray
if (sourceStr.lastIndexOf(']') > 0 && sourceJson[sattr].constructor == Array) {
for (var i = 0; i < sourceJson[sattr].length; i++) {
if (targetJson[tattr] == null) {
// 假如目标此属性null ,直接全部赋值,跳出循环
targetJson[tattr] = sourceJson[sattr];
break;
}
merge2(sourceJson[sattr][i], targetJson[tattr][i]);
}
}
if (targetJson[tattr]==null){
// 假如 target目标该属性为空,直接赋值,无需判断源是否null,反正都是null
targetJson[tattr] = sourceJson[sattr];
//该属性做完更改之后就break,省去其他循环
break;
}
}
}
}
return targetJson;
}
里面都有注释, 大家不明白的直接回复我, 我看到第一时间就会回复你.
谢谢,你我共勉
如果是java的就不用我说了, spring有一个BeanUtils, 里面有一个copyProperties()方法