javascript - 使用 Array.sort() 获得一个比较函数来对 ASC 和 DESC 进行排序?

标签 javascript

我需要按属性 price 排序对象数组 .

现在我有以下内容,可以按预期工作:

function orderByPriceASC(a,b) {
    return(
      a.price < b.price ? -1
      : a.price > b.price ? 1
        : 0
    );
  }

  function orderByPriceDESC(a,b) {
    return(
      a.price < b.price ? 1
      : a.price > b.price ? -1
        : 0
    );
  }

  function sortByPrice(order) {
    setProductList((prevState) => {
      const aux = Array.from(prevState);
      order === 'asc' ? aux.sort(orderByPriceASC) : aux.sort(orderByPriceDESC);
      return aux;
    });
  }

但是有没有一种方法可以构建它,以便我可以获得适用于 ASC 和 DESC 顺序的单个比较函数?

类似于:

function orderByPrice(a,b,order) {
    return(
      a.price < b.price ?
        order === 'asc' ? -1 : 1
      : a.price > b.price ? 1
        order === 'asc' ? 1 : -1
        : 0
    );
  }

问题是我必须将该额外参数发送到 Array.sort我认为不可能的方法。也许有一些包装函数。

如何实现?

最佳答案

您可以使用乘数并根据order变量将其设置为1-1。然后将其乘以 compareFunction 内的现有表达式(这里我假设 price 的类型为 number)

let arr = [{ price: 2 },{ price: 1 },{ price: 3 }]

function sort(array, order) {
  const multiplier = order === "asc" ? 1 : -1;
  return array.sort((a, b) => multiplier * (a.price - b.price))
}

console.log(sort(arr, "asc"))
console.log(sort(arr, "desc"))

关于javascript - 使用 Array.sort() 获得一个比较函数来对 ASC 和 DESC 进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56365461/

相关文章:

javascript - BLOB 对象不可见

javascript - 是否可以向 JQuery 的 Promise 对象添加方法?

javascript - 如何在键入时格式化 contenteditable div?

javascript - 无法使用 Twilio Client quickstart starter app 进行出站调用

javascript - 鼠标悬停图像保持不变

javascript - JQuery:查找元素位置

javascript - window.pixelRatio 在 Opera 中不起作用。还有其他选择吗?

JavaScript - 任意排序

javascript - 在 ios 应用程序中使用 google maps javascript api

javascript 日期返回未定义