JavaScript模板字面量转动态对象冗余引号问题及Mongoose排序需求
问题原因与解决方案
多余引号产生的原因
问题出在你模板字符串中额外添加的单引号:
mongooseFilters = sort.items.map(i => ({[`'${i.field}'`] : i.sortOption == SortOption.ASC ? 1 : -1}))
你用'${i.field}'给字段名手动包裹了一层单引号,导致生成的对象键变成了带单引号的字符串(比如"'name'"),这就是结果中出现多余引号的直接原因。
修正方案
1. 先修正数组生成逻辑
去掉模板字符串里的单引号,直接将字段名作为对象键:
const mongooseFilters = sort.items.map(i => ({ [i.field]: i.sortOption === SortOption.ASC ? 1 : -1 }));
此时生成的数组就是你预期的格式:
[ { 'name': 1 }, { 'surname': -1 }, { 'customerType': -1 } ]
2. 合并为单个排序对象
你的reduce写法可以正常工作,但建议添加初始空对象避免空数组报错:
const result = mongooseFilters.reduce((acc, curr) => ({...acc, ...curr}), {});
或者更高效的方式,跳过中间数组直接构建最终对象:
const result = sort.items.reduce((acc, i) => { acc[i.field] = i.sortOption === SortOption.ASC ? 1 : -1; return acc; }, {});
最终会得到你想要的格式:
{ 'name': 1, 'surname': -1, 'customerType': -1 }
内容的提问来源于stack exchange,提问作者g_m
相关产品推荐
相关产品推荐

