要求是按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)
如果和在对数组进行排序时的相对顺序方面被认为是等效的,则返回零。例如,虽然排序两个 5 被认为是等效的,因此数组在调用时应该返回 0 。a
b
[5, 3, 5]
compareFunction(5,5)
对于字符串排序,compareFunction
不需要提供 a 。根据规范,当未提供 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
将变为 1false
并将变为 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);