gpt4 book ai didi

带有 Symbol 键的 JavaScript 对象被 Stringify 删除,也无法迭代

转载 作者:行者123 更新时间:2023-11-29 20:35:09 25 4
gpt4 key购买 nike

我正在使用 Sequelize orm 模块。这是一个很棒的 orm 模块。但是在 where 选项上有些问题。

const option = { where: { name: { [Op.like]: `%${name}%` } } }
const result = await model.findOne(option)

正如您在上面的代码中看到的,name 属性将对象 Op.like 作为键。我查看了Sequelize的Op代码库,发现是SymbolOp.like 就是 Symbol.for('like')

当然使用orm本身没有问题,但我的问题是将option字符串化为json。 Json.stringify 的结果如下(删除了 Symbol 键值):

{"where":{"name":{}}}

我必须保存 where 查询的所有历史记录并在以后重用,但没有任何解决方案。研究了许多 stringify 库,例如 circular-jsonjson-stringify-safe ,但仍然是同样的问题。也读过这个 question ,但它是 value 和 Symbol 的情况,而不是 key。并尝试使用自定义替换器,但也无法对其进行迭代。

JSON.stringify(option, (key, value) => {
if(typeof key === 'symbol') {
console.log('symbol key: ', key) // nothing detected here
}
return value
})

请帮助我任何建议。

最佳答案

如评论中所述,符号键被明确排除在 JSON.stringify 之外(或者更确切地说,any keys 在其 ToString 期间抛出错误,如符号 do )。因此,它们出现在 JSON.stringify 中的唯一方法是用字符串键替换它们。

function desymbolize(o) {
if (Array.isArray(o)) {
return o.map(desymbolize);
} else if (typeof o != "object") {
return o;
} else {
let d = Object.assign(Object.create(Object.getPrototypeOf(o)), o);
Object.getOwnPropertySymbols(o).forEach(k => {
d[`<${Symbol.keyFor(k)}>`] = o[k];
delete d[k];
});
Object.keys(d).forEach(k => d[k] = desymbolize(d[k]));
return d;
}
}

const Op = { like: Symbol.for('like') };
const option = { where: [{ name: { [Op.like]: `Amadan` } }] }
const desymOption = desymbolize(option);
console.log(JSON.stringify(desymOption)); // {"where":[{"name":{"<like>":"Amadan"}}]}

关于带有 Symbol 键的 JavaScript 对象被 Stringify 删除,也无法迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56928520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com