Node.js中如何合并Sequelize的Where查询参数?
如何合并多个独立的Sequelize Where条件对象
我明白你现在遇到的问题了——你的代码里每次给periodsParam赋值都是直接替换整个对象,而不是把新属性合并进去,这就导致之前设置的delete、tipe这些属性被覆盖,最后只留下了country。下面给你几种简单的解决方法:
方法1:使用ES6对象展开运算符(最简洁)
这是现在最常用的对象合并方式,它会把原对象的所有属性展开,再添加新的属性(如果有重复属性会覆盖,这里你的场景没有重复,刚好完美合并):
var periodsParam = { delete: 'F', tipe: 1, variantid: (!ctx.params.id ? ctx.params.id : variants.id) }; if (ctx.query.country) { // 展开原对象,追加country属性 periodsParam = { ...periodsParam, country: ctx.query.country }; } console.log(periodsParam);
方法2:使用Object.assign()方法
这是ES5+就支持的API,同样可以实现对象合并,把源对象的属性复制到目标对象中:
var periodsParam = { delete: 'F', tipe: 1, variantid: (!ctx.params.id ? ctx.params.id : variants.id) }; if (ctx.query.country) { // 第一个空对象是为了避免修改原对象,如果你不需要保留原对象,也可以直接用periodsParam作为第一个参数 periodsParam = Object.assign({}, periodsParam, { country: ctx.query.country }); } console.log(periodsParam);
方法3:直接给对象添加属性(最直接)
既然你只是要给已有的对象添加一个country属性,完全不需要重新赋值整个对象,直接给属性赋值就行:
var periodsParam = { delete: 'F', tipe: 1, variantid: (!ctx.params.id ? ctx.params.id : variants.id) }; if (ctx.query.country) { periodsParam.country = ctx.query.country; } console.log(periodsParam);
额外说明
如果以后你需要合并更复杂的嵌套式Where条件(比如包含$and、$or的嵌套对象),上面的方法都是浅层合并,这时候可能需要自己写递归合并函数,或者使用Lodash的_.merge()来做深层合并,但你的当前场景用上面任意一种方法都能解决问题。
内容的提问来源于stack exchange,提问作者Nasihun Amin Suhardiyan
相关产品推荐
相关产品推荐

