【发布时间】: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