查找关键字包含点并用@replace

我有任何深度的嵌套对象,可以有任意数量的键。 我想replace“。” 在所有的键(如果包含)中用“@”表示我们如何以有效的方式做到这一点。

示例Node js对象

obj:{ "BotBuilder.Data.SessionState": { "lastAccess": 1492886892545, "version": 14, "callstack": [ { "id": "*:/", "state": { "BotBuilder.Data.WaterfallStep": 0, "BotBuilder.Data.Intent": "welcomeDialog" } } ] } 

目前我正在使用硬编码的解决scheme,但任何关键字都可以在包含“。”的任何级别的对象中使用。 我想通用的方式来解决这个问题

我的代码:

 replaceDot:function(doc){ var finalobj={} var finaldata={} var finalcallstack=new Array(); console.log("doc==>",doc) var callstack=doc["data"]["BotBuilder.Data.SessionState"]["callstack"] for(var i = 0; i < callstack.length; i++) { var tempcallstack={} if("BotBuilder.Data.WaterfallStep" in callstack[i]["state"]){ tempcallstack["id"]=callstack[i]["id"] var tempstate={} tempstate["state"]=callstack[i]["state"] tempstate["state"]["BotBuilder@Data@WaterfallStep"]=tempstate["state"]["BotBuilder.Data.WaterfallStep"] tempstate["state"]["BotBuilder@Data@Intent"]=tempstate["state"]["BotBuilder.Data.Intent"] delete tempstate["state"]["BotBuilder.Data.WaterfallStep"] delete tempstate["state"]["BotBuilder.Data.Intent"] tempcallstack["state"]=tempstate["state"]; finalcallstack.push(tempcallstack); } else{ finalcallstack.push(callstack[i]); } } var obj={} finalobj["lastAccess"]=doc["data"]["BotBuilder.Data.SessionState"]["lastAccess"] finalobj["version"]=doc["data"]["BotBuilder.Data.SessionState"]["version"] finalobj["callstack"]=finalcallstack; obj["BotBuilder@Data@SessionState"]=finalobj var secondrootobj={"BotBuilder@Data@SessionState":finalobj} return secondrootobj; } 

这是一个函数,它接受一个对象或数组,以及该对象的键的targetreplacement值。 然后它将返回一个新的对象,其中target实例被replacement (使用String.prototype.replace )在结果对象的键中。

 var substituteKeyDeep = function(obj, target, replacement) { // Get the type of the object. Array for arrays, Object for objects, null for anything else. try { var type = obj.constructor === Array ? Array : (obj.constructor === Object ? Object : null); } catch (err) { // A try/catch is actually necessary here. This is because trying to access the `constructor` property // of some values throws an error. For example `null.constructor` throws a TypeError. var type = null; } if (type === Array) { // Simply do a recursive call on all values in array var ret = []; for (var i = 0, len = obj.length; i < len; i++) { ret[i] = substituteKeyDeep(obj[i], target, replacement); } } else if (type === Object) { // Do a recursive call on all values in object, AND substitute key values using `String.prototype.replace` var ret = {}; for (var k in obj) { ret[k.replace(target, replacement)] = substituteKeyDeep(obj[k], target, replacement); } } else { // For values that aren't objects or arrays, simply return the value var ret = obj; } return ret; }; var data = { "BotBuilder.Data.SessionState": { "lastAccess": 1492886892545, "version": 14, "callstack": [ { "id": "*:/", "state": { "BotBuilder.Data.WaterfallStep": 0, "BotBuilder.Data.Intent": "welcomeDialog" } } ] } }; var dataWithRenamedKeys = substituteKeyDeep(data, /\./g, '@'); console.log(dataWithRenamedKeys);