是否可以减少JavaScript中排序助手函数的代码行?

时间:2017-03-07 08:36:45

标签: javascript arrays

我正在构建一个需要排序/过滤功能的功能。 使用辅助函数来定义自己的排序和过滤方式很简单。假设一个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

顺便说一句,如果您认为可以使其更加通用,欢迎您编辑我的问题描述和标题。

2 个答案:

答案 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
  }
}

样品:

&#13;
&#13;
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;
&#13;
&#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
}