【问题标题】:Sorting Array of Objects by Object Value Not Working按对象值排序对象数组不起作用
【发布时间】:2020-12-19 16:06:50
【问题描述】:

我有一些对象存储在一个数组中。

const products = [
    {
        title: "Gigabyte GeForce RTX 2060 OC",
        originalPrice: 329.99,
        discountPrice: 292.77,
        discountAmount: "11.28%"
    },
    {
        title: "Gigabyte GPU NV RTX2060 Windforce OC 6GB Fan",
        originalPrice: 349.99,
        discountPrice: 306.99,
        discountAmount: "12.29%"
    },
    {
        title:
            "ASUS Dual GeForce RTX 2060 OC EVO Edition 6GB GDDR6 Gaming Graphics Card with Two Powerful Axial-tech Fans (DUAL-RTX2060-O6G-EVO)",
        originalPrice: 319.98,
        discountPrice: 312.99,
        discountAmount: "2.18%"
    }
];

我正在尝试根据 Objects discountAmount 属性对数组进行排序。我花了最后一个小时在 StackOverflow 上尝试解决方案,但没有成功对数组进行排序,对象保持在同一位置。我在下面包含了我对这个问题的两个解决方案。

解决方案 1:

products.sort((a, b) => {
    const prodA = parseFloat(a["discountAmount"].replace(/%/, ""));
    const prodB = parseFloat(b["discountAmount"].replace(/%/, ""));

    if (prodA > prodB) comparsion = 1;
    else if (prodA < prodB) comparsion = -1;
    else return 0;
});

解决方案 2:

function compareValues(key, order = "asc") {
    return (a, b) => {

        // Just Checking if The Key Exists
        if (!a.hasOwnProperty(key) || !b.hasOwnProperty(key)) {
            return 0;
        }

        let prodA = typeof a[key] === "string" ? a[key].toUpperCase() : a[key];
        let prodB = typeof b[key] === "string" ? b[key].toUpperCase() : b[key];

        prodA = prodA.replace(/%/, "");
        prodB = prodB.replace(/%/, "");

        let comparison = 0;

        if (prodA > prodB) comparsion = 1;
        else if (prodA < prodB) comparsion = -1;

        return order === "desc" ? comparison * -1 : comparison;
    };
}

如果这里有明显的误解,请提前道歉。

【问题讨论】:

  • 除了去掉%之外,您还必须在比较它们之前将值转换为数字
  • 同时拼写comparison(“比较”)
  • 解决方案 1 只返回 undefined 或零。
  • 你需要返回..playcode.io/661834
  • 在解决方案 2 中,您正在检查 a[key]/b[key] 的类型,但在下一行中,您只是假设它们始终是字符串(或任何带有 .replace() 方法且接受正则表达式和字符串) - 那么为什么要首先测试它们呢?

标签: javascript arrays sorting object data-structures


【解决方案1】:

您可以使用带有parseFloat 的非常短的箭头函数,只需使用:

products.sort((a, b) => parseFloat(a.discountAmount) - parseFloat(b.discountAmount)

这里按升序排序,如果要降序排序,只需在箭头函数的返回中切换a和b

【讨论】:

    【解决方案2】:

    只返回prodA和prodB的差

    const products = [{
        title: "Gigabyte GeForce RTX 2060 OC",
        originalPrice: 329.99,
        discountPrice: 292.77,
        discountAmount: "11.28%"
      },
      {
        title: "Gigabyte GPU NV RTX2060 Windforce OC 6GB Fan",
        originalPrice: 349.99,
        discountPrice: 306.99,
        discountAmount: "12.29%"
      },
      {
        title: "ASUS Dual GeForce RTX 2060 OC EVO Edition 6GB GDDR6 Gaming Graphics Card with Two Powerful Axial-tech Fans (DUAL-RTX2060-O6G-EVO)",
        originalPrice: 319.98,
        discountPrice: 312.99,
        discountAmount: "2.18%"
      }
    ];
    
    
    let sorted = products.sort((a, b) => {
      const prodA = parseFloat(a["discountAmount"].replace(/%/, ""));
      const prodB = parseFloat(b["discountAmount"].replace(/%/, ""));
      return prodA - prodB;
    });
    
    
    console.log(sorted)

    【讨论】:

      【解决方案3】:

      下面按升序对产品进行排序,

      products.sort((a, b) => {
          return Number(a.discountAmount.replace(/%/g, "")) - Number(b.discountAmount.replace(/%/g, ""));
      })
      

      说明

      1. 删除% 符号。
      2. 将字符串转换为数字,然后进行比较。

      对于降序,你可以这样做,

      products.sort((a, b) => {
          return Number(b.discountAmount.replace(/%/g, "")) - Number(a.discountAmount.replace(/%/g, ""));
      })
      

      【讨论】:

        猜你喜欢
        • 2021-09-03
        • 2018-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-11
        • 2011-10-12
        • 2017-01-13
        相关资源
        最近更新 更多