Javascript递归问题-深度嵌套对象

Javascript递归问题-深度嵌套对象,javascript,object,recursion,Javascript,Object,Recursion,我有一个函数,它在对象的密钥上循环,并查找敏感密钥,如电子邮件、密钥、密码、apiKey、机密、机密和用户密钥 如果它找到任何具有值的值,则会对该值进行编校 但是,它有时会出现以下错误: "RangeError: Maximum call stack size exceeded" 是什么导致了无休止的递归 const deepObjectRedactor=obj=>{ 常数敏感键=[ “电子邮件”, “钥匙”, “密码”, “apiKey”, "秘密",, “秘密”, “用

我有一个函数,它在对象的密钥上循环,并查找敏感密钥,如电子邮件、密钥、密码、apiKey、机密、机密和用户密钥

如果它找到任何具有值的值,则会对该值进行编校

但是,它有时会出现以下错误:

"RangeError: Maximum call stack size exceeded"
是什么导致了无休止的递归

const deepObjectRedactor=obj=>{
常数敏感键=[
“电子邮件”,
“钥匙”,
“密码”,
“apiKey”,
"秘密",,
“秘密”,
“用户密钥”
];
Object.keys(obj.forEach)(key=>{
如果(
sensitiveKeys.map(e=>e.toLowerCase())。包括(key.toLowerCase())&&
obj[键]
) {
obj[key]='*********';
返回;
}
if(对象[键]&&typeof对象[键]=='object'){
deepObjectRedactor(obj[key]);
}
});
};
//调用redactor的函数
const customRedactorFormat=info=>{
if(info.message&&typeof info.message==='object'){
deepObjectRedactor(info.message);
}
退货信息;
});

您可以编写适用于对象和数组的通用
映射。然后编写
redact
,作为
map
-

函数映射(t,f)
{开关(t?.constructor)
{案例数组:
返回t.map((v,k)=>f(k,map(v,f)))
案例对象:
返回Object.fromEntries(
Object.entries(t.map)([k,v])=>[k,f(k,map(v,f))]
)
违约:
返回t
}
}
常数编校=(t,键=新集)=>
map(t,(k,v)=>key.has(k)?“*******”:v)
常量数据=
[{用户:1,抄送:1234,密码:“foo”}
,{nested:[{a:1,pin:999},{b:2,pin:333}]
,{deep:[{nested:[{user:2,密码:“here”}]}
]

console.log(编校(数据,新设置([“cc”,“password”,“pin”]))
这意味着它达到了内存限制。在递归基本情况下,它不被满足。
敏感键。查找
而不是
敏感键。映射可能是问题之一。可能是,对象中某处存在循环。由于您的函数不跟踪已看到的对象,因此将无限递归。另外,您的情况非常尴尬,为什么不简单:
sensitiveKeys.includes(key.toLowerCase())<代码>敏感键
是函数中的一个常量。如果希望它们都是小写,请将它们定义为所有小写。不要一次又一次地降低它们的大小写。@nishkaush您可以提供一个简化的
对象变体
代码比OP的干净得多,但是OP的代码在示例
数据
对象上的结果完全相同。我相当确定他们的问题在于他们试图递归的对象(可能是循环引用)。