Javascript 带有符号键get';由Stringify删除的,也可以';别再说了
我正在使用Sequelize orm模块。这是一个很好的orm模块。但是在where选项上,有些东西是有线的Javascript 带有符号键get';由Stringify删除的,也可以';别再说了,javascript,json,Javascript,Json,我正在使用Sequelize orm模块。这是一个很好的orm模块。但是在where选项上,有些东西是有线的 const option = { where: { name: { [Op.like]: `%${name}%` } } } const result = await model.findOne(option) 正如上面代码所示,name属性将objectOp.like作为键。我检查了Sequelize的Op的代码库,发现它是符号。Op.like只是Symbol.for('like')
const option = { where: { name: { [Op.like]: `%${name}%` } } }
const result = await model.findOne(option)
正如上面代码所示,name
属性将objectOp.like
作为键。我检查了Sequelize的Op
的代码库,发现它是符号。Op.like
只是Symbol.for('like')
当然,使用orm本身没有问题,但我的问题是将选项
字符串化为json。Json.stringify
的结果如下(符号键值被删除):
我必须保存where
查询的所有历史记录并在以后重新使用,但没有任何解决方案。
研究了许多字符串化库,如or,但仍然存在相同的问题。
我也读过这篇文章,但它是带有符号的值的情况,而不是键的情况。
并尝试使用自定义替换程序,但也无法迭代
JSON.stringify(option, (key, value) => {
if(typeof key === 'symbol') {
console.log('symbol key: ', key) // nothing detected here
}
return value
})
请帮助我提出任何建议。如注释中所述,符号键被明确排除在JSON.stringify
之外(或者更确切地说,在转换字符串时作为符号抛出错误)。因此,它们出现在JSON.stringify
中的唯一方法是用字符串键替换它们
函数去符号化(o){
if(数组isArray(o)){
返回o.map(去符号化);
}else if(类型o!=“对象”){
返回o;
}否则{
设d=Object.assign(Object.create(Object.getPrototypeOf(o)),o);
Object.getOwnPropertySymbols(o).forEach(k=>{
d[``]=o[k];
删除d[k];
});
Object.keys(d).forEach(k=>d[k]=去符号化(d[k]);
返回d;
}
}
常量Op={like:Symbol.for('like')};
const option={where:[{name:{[Op.like]:`Amadan`}}]}
const desymOption=取消符号化(选项);
console.log(JSON.stringify(desymOption));//{“where”:[{“name”:{“:“Amadan”}]}
将使用[Op.like.description]
帮助?来自MDN的JSON.stringify
docs:“所有符号键控属性将被完全忽略,即使在使用replacer函数时也是如此。”按设计工作。你想要的输出是什么?太棒了!你节省了我的时间因此,迭代符号的解决方案是getOwnPropertySymbols
函数。
JSON.stringify(option, (key, value) => {
if(typeof key === 'symbol') {
console.log('symbol key: ', key) // nothing detected here
}
return value
})