排序功能说明

时间:2019-06-03 14:14:18

标签: javascript

我是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));
    }
}

2 个答案:

答案 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
})