【问题标题】:Use sort to sort by preference?使用 sort 按偏好排序?
【发布时间】:2020-12-22 00:02:28
【问题描述】:

我有一个对象数组,它返回 3 个可能的灵敏度值:“LOW”、“MEDIUM”、“HIGH”。但是,使用下面的代码,它分别按升序排列在“HIGH - MEDIUM 和 LOW”中,我希望它返回“HIGH - MEDIUM 和 LOW”。我可以在这段代码中修复什么?

在这个函数中,我比较了数组中接收到的敏感度

orderItemsByOrderOption = (items) => {
switch (this.state.selectedOrderOption.column) {
  case "sensitivity":
    return items.sort((a, b) => {
      if (a.sensitivity > b.sensitivity) {
        return 1;
      }
      if (a.sensitivity < b.sensitivity) {
        return -1;
      }
      // a must be equal to b
      return 0;
    });

【问题讨论】:

  • 您是否打错了当前的排序方式?
  • 我不明白它当前的排序方式和您希望它的排序方式之间的区别。

标签: javascript sorting


【解决方案1】:

您可以创建一个具有所需顺序的数组,并使用该数组中数组元素的索引sensitivity 进行排序。

示例

const arr = [
  { sensitivity: "MEDIUM" },
  { sensitivity: "LOW" },
  { sensitivity: "HIGH" }
];
const order = ["HIGH", "MEDIUM", "LOW"];

arr.sort((a, b) => order.indexOf(a.sensitivity) - order.indexOf(b.sensitivity));

console.log(arr);

【讨论】:

    【解决方案2】:

    有一种方法是将排名转换为数值并比较该值

    const data = [
      { id: 1, sensitivity: "LOW" },
      { id: 2, sensitivity: "HIGH" },
      { id: 3, sensitivity: "LOW" },
      { id: 4, sensitivity: "MEDIUM" },
      { id: 5, sensitivity: "HIGH" },
      { id: 6, sensitivity: "MEDIUM" },
    ];
    
    const getRankInNum = (el) =>
      ({
        HIGH: 2,
        MEDIUM: 1,
        LOW: 0,
      }[el.sensitivity] || -1);
    
    const res = data.sort((a, b) => getRankInNum(b) - getRankInNum(a));
    
    console.log(res);

    【讨论】:

      【解决方案3】:

      您可以创建一个排序顺序查找,将 HIGH、MEDIUM 和 LOW 映射到数值,因为按字母顺序排序没有意义。

      const sensitivitySortOrder = {
        HIGH: 0,
        MEDIUM: 1,
        LOW: 2
      };
      
      orderItemsByOrderOption = (items) => {
      switch (this.state.selectedOrderOption.column) {
        case "sensitivity":
          return items.sort((a, b) => {
            const aRank = sensitivitySortOrder[a.sensitivity];
            const bRank = sensitivitySortOrder[b.sensitivity];
            if (aRank > bRank) {
              return 1;
            }
            if (aRank < bRank) {
              return -1;
            }
            // a must be equal to b
            return 0;
          });
      
      

      【讨论】:

        猜你喜欢
        • 2011-01-31
        • 2014-08-09
        • 1970-01-01
        • 2010-12-11
        • 2021-09-09
        • 1970-01-01
        • 2019-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多