javascript - 使用Javascript递归替换未知大小的对象中的键
问题描述
我希望能够keys
使用 Javascript 在动态大小的对象中替换某些内容。例如,我有一个可能如下所示的对象:
var obj = {
where: {
hypes: {
lte: 12 <-- replace key
},
or: [
{
hypes: {
lt: 14 <-- replace key
}
},
{
id: {
lt: 10 <-- replace key
}
}
]
}
}
为了使该对象与我一起使用,Sequelize
我需要将以下键转换为Sequelize
运算符:lt
、or
和lte
. 我创建了一个operators
充当字典的对象,因此我可以从中提取Sequelize
运算符:
const operators = {
'eq': [Op.eq],
'lte': [Op.lte],
'lt': [Op.lt],
'or': [Op.or]
};
我在想我可以使用operators
对象来匹配的键obj
并将其替换为operators
对象的值。我想我可以使用以下递归函数来遍历obj
给定的未知大小:
const iterate = (obj) => {
Object.keys(obj).forEach(key => {
console.log(`key: ${key}, value: ${obj[key]}`)
if (typeof obj[key] === 'object') {
iterate(obj[key])
}
})
}
上面的函数将检查一个键的值是否是一个对象,并iterate()
再次调用该方法。
因此我可以调用:iterate(obj)
它会递归地映射对象中的所有嵌套属性。
我遇到的问题是,当键与对象内的属性匹配时,如何替换键,operators
以便最终得到obj
如下所示的键:
var obj = {
where: {
hypes: {
lte: 12
},
[Op.or]: [ <-- changed
{
hypes: {
[Op.lt]: 14 <-- changed
}
},
{
id: {
[Op.lt]: 10 <-- changed
}
}
]
}
}
谢谢!
解决方案
您可以采用递归方法。
function replace(object) {
return Array.isArray(object)
? object.map(replace)
: object && typeof object === 'object'
? Object.fromEntries(Object
.entries(object)
.map(([k, v]) => [k in operators ? operators[k] : k, replace(v)])
)
: object;
}
var obj = { where: { hypes: { lte: 12 }, or: [{ hypes: { lt: 'xx' } }, { id: { lt: 10 } }] } };
const operators = { eq: '[Op.eq]', lte: '[Op.lte]', lt: '[Op.lt]', or: '[Op.or]' };
console.log(replace(obj));
推荐阅读
- mysql - MySQL 在两个 ISO 格式的日期之间进行选择
- c++ - 带有 libc++ 异常的 Clang
- python - Python中普通变量访问有什么用?
- mongodb - 计算 MongoDB 中每个用户的页面查看日志
- xamarin - 如何使用 SkiaSharp 测量尾随空格?
- c# - 如何在 ASP.NET Core 中结合 FromBody 和 FromForm BindingSource?
- jquery - 如何安排从 JSON 文件接收和发送的聊天对话数据?
- sql - 使用基于不同表的关系的数据创建 SQL 视图
- jenkins-plugins - 每次构建后如何在jenkins中附加一个html文件来触发电子邮件通知?
- angular5 - 在 IE 中用 ngOnit() 编写时,可观察订阅不起作用