Javascript 获取在对象文本中定义的符号值,并迭代其值
我有一个对象文字,如下所示Javascript 获取在对象文本中定义的符号值,并迭代其值,javascript,node.js,sequelize.js,Javascript,Node.js,Sequelize.js,我有一个对象文字,如下所示 { is_active: true, start_date: { [Symbol(lt)]: 2020-02-24T12:56:36.780Z }, expiry_date: { [Symbol(gt)]: 2020-02-24T12:56:36.780Z }, [Symbol(or)]: [ { user_id: 'M' }, { user_id: null } ] } 这些对象在查询数据库之前由sequelize自动生成 我需要遍历所有对象键,并
{
is_active: true,
start_date: { [Symbol(lt)]: 2020-02-24T12:56:36.780Z },
expiry_date: { [Symbol(gt)]: 2020-02-24T12:56:36.780Z },
[Symbol(or)]: [ { user_id: 'M' }, { user_id: null } ]
}
这些对象在查询数据库之前由sequelize自动生成我需要遍历所有对象键,并更改该键的值,该键为
id
或以\u id
结尾这是我第一次使用符号数据类型。我读过一篇文章,上面说它们不能在中使用
for…或对象…键
我也读了一个答案,但它只说了如何访问它。
下面是我的函数,它递归遍历对象并解密id
和以\u id
结尾的密钥值
function decryptIds(obj) {
if (typeof obj === 'object' && obj !== null) {
for (let key in obj) {
if (Array.isArray(obj[key])) {
for(let i = 0; i< obj[key].length; i++) {
if(typeof obj[key][i] === 'object' && obj[key][i] !==null)
decryptIds(obj[key][i].where)
else
obj[key][i] = decrypt(obj[key][i])
}
} else if (typeof obj[key] === 'object' && obj !== null) {
decryptIds(obj[key].where)
}
else if (key === 'id' || key.endsWith('_id')) {
obj[key] = decrypt(obj[key])
}
}
}
return
}
decryptIds(model.where)
函数解密ID(obj){
如果(对象的类型=='object'&&obj!==null){
用于(输入obj){
if(Array.isArray(obj[key])){
for(设i=0;i
不知怎的,我成功地做到了。我知道这不是解决方案,它很容易可行。我会继续努力,直到找到更好的方法。现在还可以
beforeFind: (model, options) => {
function decryptIds(obj) {
if(typeof obj === 'object' && obj!==snull &&Object.getOwnPropertySymbols(obj)) {
const objectSymbols = obj[Object.getOwnPropertySymbols(obj)[0]]
if(objectSymbols) {
objectSymbols.forEach(el => {
decryptIds(el)
})
}
}
if (typeof obj === 'object' && obj !== null) {
for (let key in obj) {
if (Array.isArray(obj[key])) {
for(let i = 0; i< obj[key].length; i++) {
if(typeof obj[key][i] === 'object' && obj[key][i] !==null)
decryptIds(obj[key][i].where)
else
obj[key][i] = decrypt(obj[key][i])
}
}
else if (key === 'id' || key.endsWith('_id')) {
if(obj[key]) {
obj[key] = decrypt(obj[key])
}
} else if (typeof obj[key] === 'object' && obj !== null) {
decryptIds(obj[key].where)
}
}
}
return
}
console.log(model.where)
decryptIds(model.where)
console.log(model.where)
},
beforeFind:(模型,选项)=>{
函数ID(obj){
if(typeof obj==='object'&&obj!==snall&&object.getOwnPropertySymbols(obj)){
const objectSymbols=obj[Object.getOwnPropertySymbols(obj)[0]]
if(对象符号){
objectSymbols.forEach(el=>{
解密ID(el)
})
}
}
如果(对象的类型=='object'&&obj!==null){
用于(输入obj){
if(Array.isArray(obj[key])){
for(设i=0;i
为什么不使用诸如和、或等s/t iterable作为键?@NinaScholz抱歉,我没有放太多信息,不过我会更新。这些对象在查询数据库之前由sequelize自身自动生成。所以我不能改变它们。符号的目的之一是明确禁止这个用例——如果你正在构造查询,在得到符号化的结果之前进行修改。