javascript - 两个回调作为 Array.sort() 的参数,而不是 Array.sort().sort()

标签 javascript sorting callback

我正在尝试返回已排序产品的列表:

return products.sort(getSortFunc(activeSortId))

每个activeSortId对应一个排序回调函数,通过调用 getSortFunc 来检索。我有三个排序函数:sortByPriceAscsortByPriceDescsortByDate

问题:当用户sortByPriceDesc后跟sortByDate时,结果仍然(逻辑上)按降序价格排序。不过,我希望按价格升序排序。我可以通过链接排序函数( return products.sort(a).sort(b).sort(c) )来解决这个问题,但是如果我不知道顺序怎么办?:

我想知道是否可以通过调用例如函数 sortByDate 中的 sortByPriceAsc 或类似的东西?下面是一个简化的尝试,但显然它不起作用,因为调用 sortByPriceAsc 不会修改任何内容:

sortByPriceAsc: (a, b) => a.price - b.price,
sortByDate: (a, b) => {
  this.sortByPriceAsc()
  return b.date - a.date
}

很高兴获得任何帮助或一般性批评。

最佳答案

一种选择是使用一个持久变量来指示最后的升/降序排序顺序。然后,在 sortByDate 中,无论何时调用它,都检查该变量以确定在两个日期相同的情况下返回什么:

const arr = [
  { date: 1, price: 5 },
  { date: 2, price: 10 },
  { date: 2, price: 20 },
  { date: 3, price: 30 },
  { date: 3, price: 40 },
  { date: 4, price: 50 },
];

let lastWasAsc = false;
const sorts = {
  sortByPriceAsc: (a, b) => a.price - b.price,
  sortByDate: (a, b) => {
    return b.date - a.date || (
      lastWasAsc
      ? a.price - b.price
      : b.price - a.price
    );
  }
};

// When sorting by ascending order, set lastWasAsc to true:
lastWasAsc = true;
arr.sort(sorts.sortByPriceAsc);

// Then, later:
arr.sort(sorts.sortByDate);
console.log(arr);

与调用 sortByDatelastWasAscfalse 相比:

const arr = [
  { date: 1, price: 5 },
  { date: 2, price: 10 },
  { date: 2, price: 20 },
  { date: 3, price: 30 },
  { date: 3, price: 40 },
  { date: 4, price: 50 },
];

let lastWasAsc = false;
const sorts = {
  sortByPriceAsc: (a, b) => a.price - b.price,
  sortByDate: (a, b) => {
    return b.date - a.date || (
      lastWasAsc
      ? a.price - b.price
      : b.price - a.price
    );
  }
};

// Then, later:
arr.sort(sorts.sortByDate);
console.log(arr);

请记住,arr.sort(cb1).sort(cb2)不一定会考虑按cb1排序的任何内容 -排序算法不一定稳定,因此不同实现的行为会有所不同(因此不应使用 .sort(..).sort( )。

(稳定的排序算法 is when ,当两个元素由于具有相同的“权重”而被确定在结果中彼此相邻时,它们在输出中的顺序与它们在输入中的顺序相同。这在 Javascript 中是无法保证的。虽然 ES2019 要求 Array#sort 保持稳定,但并非所有实现都符合这一要求。)

关于javascript - 两个回调作为 Array.sort() 的参数,而不是 Array.sort().sort(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58247594/

相关文章:

javascript - Javascript 中一个类的所有实例的公共(public)回调

javascript - 有没有更好的方法使用 Horizo​​n 来处理 "join"数据?

javascript - 我可以用 .data("...

c# - 我该如何排序这个列表?

node.js - Nodejs 循环中的 promise

从变量获得的 javascript 正则表达式在测试 : "is not a function" 时给出错误

ios - 按字母顺序更改数组中的标签文本

regex - 如何在awk中打​​印没有字段分隔符的行?

c++ - Windows 到 Linux 移植 : how to replace __stdcall?

android - 从其他类回调 Activity