ไม่สมบูรณ์แบบ แต่จะใช้ได้ในสถานการณ์ส่วนใหญ่: แทนที่อักขระต้องห้ามด้วยอย่างอื่น เนื่องจากมันอยู่ในคีย์ตัวอักษรใหม่เหล่านี้จึงค่อนข้างหายาก
encodeMongoObj = function(o, level = 10) {
var build = {}, key, newKey, value
for (key in o) {
value = o[key]
if (typeof value === "object") value = (level > 0) ? encodeMongoObj(value, level - 1) : null
newKey = key.replace(/\\/g, '⍀').replace(/^\$/, '₴').replace(/\./g, '⋅')
build[newKey] = value
}
return build
}
decodeMongoObj = function(o) {
var build = {}, key, newKey, value
for (key in o) {
value = o[key]
if (typeof value === "object") value = decodeMongoObj(value)
newKey = key.replace(/⍀/g, '\\').replace(/^₴/, '$').replace(/⋅/g, '.')
build[newKey] = value
}
return build
}
นี่คือการทดสอบ:
var nastyObj = {
"sub.obj" : {"$dollar\\backslash": "$\\.end$"}
}
nastyObj["$you.must.be.kidding"] = nastyObj
var encoded = encodeMongoObj(nastyObj, 1)
console.log(encoded)
console.log( decodeMongoObj( encoded) )
และผลลัพธ์ - โปรดทราบว่าค่าจะไม่ถูกแก้ไข:
{
sub⋅obj: {
₴dollar⍀backslash: "$\\.end$"
},
₴you⋅must⋅be⋅kidding: {
sub⋅obj: null,
₴you⋅must⋅be⋅kidding: null
}
}
[12:02:47.691] {
"sub.obj": {
$dollar\\backslash: "$\\.end$"
},
"$you.must.be.kidding": {
"sub.obj": {},
"$you.must.be.kidding": {}
}
}