2016-08-23 56 views
1

如何檢查兩個對象之間的差異並添加缺失值?兩個對象之間的差異並添加缺失值

例子:https://jsfiddle.net/aca0hdv9/

var defaultOptions = { 
     monit : { 
      map:{ 
       googleMap: false 
      }, 
      vehiclesList: { 
       rightSide: false, 
       number: true, 
       driver: true, 
       note: true, 
      }, 
      vehicleCloud: { 
       speed: true, 
       date: true, 
       alarms: true, 
       fuelsCloud: true 
      }, 
      driverCloud: true 
    }; 

var userCacheOptions = { 
     monit : { 
       // Missing map options 
      vehiclesList: { 
       rightSide: false, 
       number: false, 
       driver: false 
       // Missing note option 
      }, 
      vehicleCloud: { 
       speed: true, 
       date: true, 
       alarms: true, 
       fuelsCloud: true 
      }, 
      // Missing driverCloud option 
     } 
    }; 

我不想指定默認值,我只是想添加缺失值。任何想法如何以最簡單的方式做到這一點?

回答

0

這是您要遵循的模式,您只需爲每個檢查添加適當的操作即可。

if(!(defaultOptions.equals(userCacheOptions))){ 

     //check for userCacheOptions if the value is set 
     //if its not set then set it as you want 

     if(!(userCacheOptions.getGoogleMap().isSet())){ 
      userCacheOptions.setGoogleMap("whatever you want to set"); 
     } 

     //same each variable etc 
    } 
+0

我需要更多的自動化解決方案:) – snuuve

1

您可以使用Object.keys來獲取所有ennumerable鍵。從那裏,你只需要遍歷它們。

var defaultOptions = { 
 
    monit: { 
 
    map: { 
 
     googleMap: false 
 
    }, 
 
    vehiclesList: { 
 
     rightSide: false, 
 
     number: true, 
 
     driver: true, 
 
     note: true, 
 
    }, 
 
    vehicleCloud: { 
 
     speed: true, 
 
     date: true, 
 
     alarms: true, 
 
     fuelsCloud: true 
 
    }, 
 
    driverCloud: true 
 
    } 
 
}; 
 

 
var userCacheOptions = { 
 
    monit: { 
 
    // Missing map options 
 
    vehiclesList: { 
 
     rightSide: false, 
 
     number: false, 
 
     driver: false 
 
     // Missing note option 
 
    }, 
 
    vehicleCloud: { 
 
     speed: true, 
 
     date: true, 
 
     alarms: true, 
 
     fuelsCloud: true 
 
    } 
 
    // Missing driverCloud option 
 
    } 
 
}; 
 

 
function fillBlanks(receiver, giver) { 
 
    var receiverkeys = Object.keys(receiver); 
 
    var giverkeys = Object.keys(giver); 
 
    for(var i = 0; i < giverkeys.length; i++) { 
 
    if(typeof receiver[giverkeys[i]] != typeof giver[giverkeys[i]]) { 
 
     receiver[giverkeys[i]] = giver[giverkeys[i]]; 
 
    } 
 
    if(receiver[giverkeys[i]] != giver[giverkeys[i]]) { 
 
     receiver[giverkeys[i]] = giver[giverkeys[i]]; 
 
    } 
 
    } 
 
} 
 
fillBlanks(userCacheOptions.monit, defaultOptions.monit); 
 
console.log(userCacheOptions.monit);

1

你可以遍歷鍵和檢查對象,並調用該函數的遞歸與新的對象進行檢查。如果缺少一個值,則將其設置爲默認值。

1

我會如下做好這項工作;它遞歸迭代並修改位置處的對象userCacheOptions

var defaultOptions = { 
 
     monit : { 
 
      map:{ 
 
       googleMap: false 
 
      }, 
 
      vehiclesList: { 
 
       rightSide: false, 
 
       number: true, 
 
       driver: true, 
 
       note: true, 
 
      }, 
 
      vehicleCloud: { 
 
       speed: true, 
 
       date: true, 
 
       alarms: true, 
 
       fuelsCloud: true 
 
      }, 
 
      driverCloud: true 
 
      } 
 
    }; 
 

 
var userCacheOptions = { 
 
     monit : { 
 
       // Missing map options 
 
      vehiclesList: { 
 
       rightSide: false, 
 
       number: false, 
 
       driver: false 
 
       // Missing note option 
 
      }, 
 
      vehicleCloud: { 
 
       speed: true, 
 
       date: true, 
 
       alarms: true, 
 
       fuelsCloud: true 
 
      }, 
 
      // Missing driverCloud option 
 
     } 
 
    }; 
 

 
function restoreMissing(def,obj){ 
 
    Object.keys(def).map(k => (typeof def[k] === "object" && 
 
          typeof obj[k] === "object") ? restoreMissing(def[k],obj[k]) 
 
                 : !obj[k] && (obj[k] = def[k])); 
 
    return obj; 
 
} 
 

 
console.log(restoreMissing(defaultOptions,userCacheOptions))