您好我正在处理一个以最低价格对JSON对象进行排序的函数。
这就是结构的样子
{
"successful": true,
"products": [
{
"id": "47",
"name": "HP LP3065",
"price": "$119.50",
"description": "",
"special": false,
"rating": 0
},
{
"id": "43",
"name": "MacBook",
"price": "$589.50",
"description": "",
"thumb": "data/demo/macbook_1.jpg",
"special": false,
"rating": 0
}
]
}
这就是我目前的排序功能的样子
data.products.sort(function(a, b){
if (a.price.substr(1, a.price.length) === b.price.substr(1, b.price.length)) {
if (a.price.substr(1, a.price.length) > b.price.substr(1, b.price.length)) {
return b;
}
return a;
}
});
我所做的当前功能不起作用,你们有什么建议吗?
答案 0 :(得分:1)
您需要重写比较器以返回数字。 MDN
function price(obj) { //convert obj.price to float
return parseFloat(obj.price.replace(/[^\.\d]/g, ''));
}
data.products.sort(function(a, b){
return price(a) - price(b);
});
答案 1 :(得分:0)
您将价格作为字符串进行比较,这就是您没有得到预期结果的原因。您应该将价格解析为浮点数。
您的substr
来电不正确,您指定的长度是一个字符,因为您跳过一个字符。 (但是这不会使调用不按预期进行,因为该方法接受超出范围的值。)。它应该是a.price.substr(1, a.price.length - 1)
,但您可以跳过第二个参数,将所有字符都放到字符串末尾:a.price.substr(1)
。
比较数字时,您可以从另一个中减去一个。这将给出sort
方法期望的负/零/正结果:
data.products.sort(function(a, b){
return parseFloat(a.price.substr(1)) - parseFloat(b.price.substr(1));
});