替換我有嵌套的對象,可以有任何深度的任意數量的鍵。 我想替換「。」在所有鍵(如果包含)中加上「@」我們如何以有效的方式做到這一點。查找關鍵字包含點,並用@
實施例節點的js對象
obj:{
"BotBuilder.Data.SessionState": {
"lastAccess": 1492886892545,
"version": 14,
"callstack": [
{
"id": "*:/",
"state": {
"BotBuilder.Data.WaterfallStep": 0,
"BotBuilder.Data.Intent": "welcomeDialog"
}
}
]
}
目前我使用硬編碼解決方案,但任何密鑰可在對象在其中包含任何電平是可能的「」我想概括的方式來解決這個問題
我的代碼:
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"]["[email protected]@WaterfallStep"]=tempstate["state"]["BotBuilder.Data.WaterfallStep"]
tempstate["state"]["[email protected]@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["[email protected]@SessionState"]=finalobj
var secondrootobj={"[email protected]@SessionState":finalobj}
return secondrootobj;
}
「任意深度處的任意數量的鍵」< - 循環訪問每個對象屬性/數組的值可能非常昂貴。這更加困難,因爲你可能在數組內的對象內部有數組等等。使用直接遞歸reduce函數可以讓你這樣做,但效率不高。你可能會發現對它進行硬編碼,就像你在這裏所做的那樣,使用for-loops和push是最有效的方法。 – d4nyll
但任何數量的密鑰都可以..在任何深度..鍵名也可以是任何..這個文件我從服務器..我不能在服務器端更改.. –