所以上面的答案是最好的解决方案,因为它是 ES6 并且更优雅。在得到这个答案并更深入地研究之后,我想分享我学到的 ES5 老派方式。
在 ES5 中我了解到你可以像这样定义一个对象:
module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
// write a query that will follow sort, offset, limit options only
// do not worry about criteria yet
const sortOrder = {};
Artist.find({})
.sort()
.skip(offset)
.limit(limit);
};
我把它变成了一个空对象,然后查看它并添加sortProperty等于1,如下所示:
module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
// write a query that will follow sort, offset, limit options only
// do not worry about criteria yet
const sortOrder = {};
sortOrder[sortProperty] = 1;
Artist.find({})
.sort()
.skip(offset)
.limit(limit);
};
然后我可以像这样传递sortOrder:
module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
// write a query that will follow sort, offset, limit options only
// do not worry about criteria yet
const sortOrder = {};
sortOrder[sortProperty] = 1;
Artist.find({})
.sort(sortOrder)
.skip(offset)
.limit(limit);
};
好的,如果有人有兴趣了解它,那就是 ES5 方法,但正如您在上面看到的,ES6 解决方案看起来更好。
创建一个对象并同时为其添加属性的整个问题在于它在 ES5 中没有得到很好的支持,我们必须首先声明一个对象,然后向它添加一个属性并将该属性设置为等于 1。
方括号表示查看sortProperty 变量:
sortOrder[sortProperty] = 1;
这是一个字符串,我正在尝试将name 的sortOrder 属性添加到此对象并将其设置为等于1,因此如果您在Chrome 控制台或代码中运行它,最终结果是sn-p 是{ name: 1 }。
我的学习曲线和所选答案帮助我学习的是 ES6 插值属性或键。这件事:
.sort({ [sortProperty]: 1 })
这里发生的事情是在运行时查看sortProperty 变量及其相等的值,将该属性添加到该对象并为其赋予值1。
所以要清楚,是的,最初给出的答案是我采用的优雅解决方案:
module.exports = (criteria, sortProperty, offset = 0, limit = 20) => {
// write a query that will follow sort, offset, limit options only
// do not worry about criteria yet
Artist.find()
.sort({ [sortProperty]: 1 })
.skip(offset)
.limit(limit);
};
我只是分享我在学习和实施它的过程中学到的东西。