重點申明一下, 這個方法 只限於兩個完全一樣的對象 ,不一樣的對象請使用 下面的進行合併,
<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()方法