查找关键字包含点并用@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; }
这是一个函数,它接受一个对象或数组,以及该对象的键的target
和replacement
值。 然后它将返回一个新的对象,其中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);