我是JavaScript编程的新手。我的团队成员之一写了我不太了解的代码,由于语言障碍,该人无法正确解释它。
该代码应用于对网站上的项目进行排序。我知道函数changeOptionValue
由switch语句组成。我们有3种情况,最低,最高和字母顺序。我们通过sort.method调用下面每个实例中定义的sort_by
变量。
参数('price',false,parseFloat)引用不同的内容。第一个参数用于设置列表。第二个参数用于设置测试条件(问题:为什么在小写情况下为假,在大写情况下为真)。第三个参数parseFloat用于显示内容,它是一个浮点数。
总的来说,我不明白的是函数表达式var sort_by
。底漆是否指的是浮点数?因此,如果我检查primer!=null
,并且检查它是否为浮点数,并在该字段中返回数字。在第二种情况下,我只是检索字符串并按字母顺序检查它们。
最后,我使用相反的顺序对由(a> b)部分按字母顺序表示的事物进行逻辑排序。
function changeOptionValue() {
var option = document.getElementById("optionMenu").value;
var toOrder = getProducts();
switch (option) {
case "lowest":
toOrder.sort(sort_by('price', false, parseFloat))
break;
case "highest":
toOrder.sort(sort_by('price', true, parseFloat))
break;
case "alphabetical":
toOrder.sort(sort_by('name', false, ))
break;
default:
break;
}
setProducts(toOrder);
generateShopDOM()
}
var sort_by = function (field, reverse, primer) {
//To get the value of the object (name or price)
var key;
if (primer!=null){
key= function (x) { return primer(x[field]) }
} else{
key= function (x) { return x[field] };
}
//if you want it low to high or vice versa
if(reverse==true){
reverse=-1;
}else{
reverse=1;
}
return function (a, b) {
return a = key(a), b = key(b), reverse * ((a > b) - (b > a));
}
}
答案 0 :(得分:3)
作为快速入门,Array.prototype.sort()
对给定数组进行排序,默认情况是按字典顺序,或者使用比较器函数定义排序顺序。
在您的代码示例中,函数sort_by(...)
是一个高阶函数,如果可以的话,它是工厂函数,它将根据给定的参数创建比较器函数。让我们依次查看其参数:
field
是比较对象中用于比较的字段; reverse
定义排序是升序还是降序; primer
也可以称为解析器或规范化器,它是标准化输入值的可选功能。在上面的示例中,parseFloat()
用于规范化值。请注意,该函数未调用,但作为参数传递,稍后被调用。 primer != null
条件检查是否定义了解析器,如果定义了解析器,请在比较之前使用它对值进行归一化。
返回语句(a > b) - (b > a)
是比较值的规范安全方法,请参阅this answer以获得更多信息。
要把所有这些都放在上下文中,调用
toOrder.sort(sort_by('price', true, parseFloat))
将创建一个比较器函数(返回值sort_by
),该函数随后将通过使用toOrder
字段中的值对'price'
数组进行排序,并以相反的顺序返回( reverse === true
),在比较之前将字段值解析为浮点数(primer === parseFloat
)。
答案 1 :(得分:0)
您的同事正在使用所谓的高阶函数,实际上它非常聪明!不过,您将不得不倒退并弄清楚他做了什么,但我会给您一个开始的地方:
toOrder.sort(sort_by('price', false, parseFloat))
最终变得与此等效:
toOrder.sort(function(a,b){
a = parseFloat(a['price']);
b = parseFloat(b['price']);
return (a > b) - (b > a); // this bit of code returns 0 if they are equal or -1 if b is bigger, or 1 if a is bigger, never seen this before but it's kinda cool
})