我正在构建一个需要排序/过滤功能的功能。 使用辅助函数来定义自己的排序和过滤方式很简单。假设一个GitHub案例(假设下面的代码都是可运行的)
compareRepoByModifiedTimeAscending (a, b) {
return a.timestamp > b.timestamp ? 1 : 0
}
compareRepoByModifiedTimeDesending (a, b) {
return a.timestamp > b.timestamp ? 0 : 1
}
compareRepoByOwnerNameAscending (a, b) {
return a.ownerName > b.ownerName ? 1 : 0
}
compareRepoByOwnerNameDesending (a, b) {
return a.ownerName > b.ownerName ? 0 : 1
}
....
我有许多(也许是太多)这样的简单辅助函数,实际上,它们的结构非常相似。是否有可能找到一种方法来缩小代码库,除非使用switch
?
答案 0 :(得分:3)
您可以使用currying function绑定键来排序和排序顺序并返回通用排序函数。
function sortByString(key, asc) {
asc = asc ? 1 : -1;
return function(a, b) {
return a[key] > b[key] ? -1 * asc : a[key] < b[key]: 1 * asc: 0
}
}
样品:
function sortByString(key, asc) {
asc = asc ? 1 : -1;
return function(a, b) {
return a[key] > b[key] ? -1 * asc : a[key] < b[key] ? 1 * asc : 0
}
}
var obj = [];
// Create a dummy list of objects
for (var i = 0; i < 10; i++) {
obj.push({
timestamp: Date.now(),
i: i * Math.floor(Math.random() * 10)
})
}
console.log(obj)
obj.sort(sortByString("i", 1))
console.log(obj)
obj.sort(sortByString("i", 0))
console.log(obj)
&#13;
答案 1 :(得分:1)
您可以创建一个更通用的比较函数,接受两个额外的参数:要比较的属性的名称(propName
)和排序order
。
function compareRepo (propName, order, a, b) {
// You may want to check validity of inputs, or initialize with proper defaults.
if (['timestamp', 'ownerName'].indexOf(propName) === -1)
throw new Error('invalid property name used')
if (order === 'asc')
return a[propName] > b[propName] ? 1 : 0
else
return a[propName] > b[propName] ? 0 : 1
}