要求按
resHP
属性升序排序,对于任何平局,按
resFlow
属性降序排序。
现在,Javascript的
Array.prototype.sort
函数允许我们对数组进行排序。它接受一个参数,即
"compareFunction"。compareFunction接受两个参数,它们是要比较的数组元素,并且必须返回它们在预期结果数组中的相对位置。
function compareFunction (itemA, itemB) {...}
compareFunction(a, b)
函数返回一个数字,如果b
在结果中排在a
之前,则该数字大于零。
compareFunction(a, b)
函数返回一个数字,如果b
在结果中排在a
之后,则该数字小于零。
compareFunction(a, b)
函数返回零,如果在排序数组时,a
和b
被认为是相等的。例如,在对[5, 3, 5]
进行排序时,两个5被认为是相等的,因此当调用compareFunction(5,5)
时,数组应返回0。
对于字符串的排序,不需要提供compareFunction
函数。根据规范,当未提供compareFunction时,会将数组中的每个值转换为字符串,然后进行排序。以下是一个示例:
console.log('["z", "ct", "a", "aa", "ab", "bc"].sort(): ', ["z", "ct", "a", "aa", "ab", "bc"].sort());
常见错误:
没有使用compareFunction进行数字比较
尽管按规定,compareFunction是可选的,但如果在对数字或其他对象进行排序时未提供它,可能导致不正确的结果。请看下面的例子:
console.log("[1, 2, 5, 3, 0, 20].sort(): ", [1, 2, 5, 3, 0, 20].sort());
这里20出现在3之前,因为每个数字在比较之前都被转换为字符串,由于在字典中“20”排在“3”之前(如果有这样的字典),所以它在结果中出现在“3”之上。
从compareFunction中返回布尔值而不是数字值
这是我在原始答案中的错误。
当您从compareFunction中返回布尔值而不是数字值时,布尔值会被转换为数字。也就是说,true
将变成1,false
将变成0,但您没有返回-1。
var array = [
{
compareThis: 1,
originalIndex: 1
},
{
compareThis: 2,
originalIndex: 2
},
{
compareThis: -1,
originalIndex: 3
},
{
compareThis: -2,
originalIndex: 4
}
];
console.log(array.sort((a, b) => a.compareThis > b.compareThis));
在这里,结果是未排序的同一数组,因为当2和-1进行比较时,比较2>-1返回false,被转换为0。但是,当compareFunction返回0时,它表示两个元素的顺序应该保持不变。因此,该数组不会被排序。
对此数组进行正确的排序方式如下:
var array = [
{
compareThis: 1,
originalIndex: 1
},
{
compareThis: 2,
originalIndex: 2
},
{
compareThis: -1,
originalIndex: 3
},
{
compareThis: -2,
originalIndex: 4
}
];
console.log(array.sort((a, b) => a.compareThis - b.compareThis));
因此,解决问题的正确方式是:
var array = [{ resVal: "25FA15", resFlow: 49, resName: "Rendimiento Tri-Seal Completo", resPhoto: "Tri-Sealseries.png", resHP: 1.5 },
{ resVal: "25FA2", resFlow: 52, resName: "Rendimiento Tri-Seal Completo", resPhoto: "Tri-Sealseries.png", resHP: 2 },
{ resVal: "45FA2", resFlow: 53, resName: "Rendimiento Hi-Cap Completo", resPhoto: "HighCapseries.png", resHP: 2 },
{ resVal: "35FA2", resFlow: 59, resName: "Rendimiento Hi-Cap Completo", resPhoto: "HighCapseries.png", resHP: 2 }];
array.sort(function sortByResHP(a, b) {
return (a.resHP - b.resHP) !== 0 ? (a.resHP - b.resHP) : (b.resFlow - a.resFlow);
});
console.log("Result: ", array);
当然,这可以进一步缩短,如其他答案所示。我保留了较长的compareFunction版本,以使其更易于阅读。
原始(不正确)答案
你可以使用Array#sort
来实现:
array = [{ resVal: "25FA15", resFlow: 49, resName: "Rendimiento Tri-Seal Completo", resPhoto: "Tri-Sealseries.png", resHP: 1.5 },
{ resVal: "25FA2", resFlow: 52, resName: "Rendimiento Tri-Seal Completo", resPhoto: "Tri-Sealseries.png", resHP: 2 },
{ resVal: "45FA2", resFlow: 53, resName: "Rendimiento Hi-Cap Completo", resPhoto: "HighCapseries.png", resHP: 2 },
{ resVal: "35FA2", resFlow: 59, resName: "Rendimiento Hi-Cap Completo", resPhoto: "HighCapseries.png", resHP: 2 }]
array.sort(function(d1,d2) {
if(d1.resHP == d2.resHP) {
return d1.resFlow < d2.resFlow;
} else {
return d1.resHP > d2.resHP;
}
});
console.log(array);
resHP
从低到高排序,然后对于那些值相等的,按照resFlow
从高到低排序? - Frxstrem