首页 新闻 会员 周边

sort(compare)方法

0
[已解决问题] 解决于 2019-01-03 15:23

最近在看js高级3,书中对于排序地方自己读了很不了解

sort()函数可以对数组进行排序,他默认是将数组中的元素调用toString()方法,所以得到的结果会是1,25,3
很显然这不是我们要的结果,所他传入了compare方法作为参数

function compare(a,b){
if(a>b){
return sha?
}
if(a=b){
return 0
}
if(a<b){
return sha?
}
}

我不理解的是执行原理是什么样的?先执行哪个函数?compare函数只有2个参数,为什么会依次去拿数组中的元素?

求大神帮我捋捋思路

问题补充:

我此时还是没有理解函数带括号和不带括号的区别

  • 带括号是是调用函数
  • 不带括号是将整个函数放在那个地方

看例子

function isBelowThreshold(currentValue) {
  return currentValue < 40;
}

var array1 = [1, 30, 39, 29, 10, 13];

console.log(array1.every(isBelowThreshold));
// expected output: true

这里我就很在意括号内的那个函数名

我知道可以写成这样

console.log(array1.every(isBelowThreshold));
//改成
console.log(array1.every(function isBelowThreshold(currentValue) {
  return currentValue < 40;
});

所以这里就是一个方法去比较数组中数是否小于40,然后数组中数默认就去比较?

那么问题来了why?我感觉结论就好像要出来,但是不理解咋办?

无所不能的风的主页 无所不能的风 | 初学一级 | 园豆:156
提问于:2018-12-30 10:00
< >
分享
最佳答案
0
奖励园豆:5
jello chen | 大侠五级 |园豆:7306 | 2018-12-31 01:02

谢谢!我又看到 数组中的reduce方法,也是传入函数,参数是 prev,curr
这些都是类似的吧

无所不能的风 | 园豆:156 (初学一级) | 2018-12-31 10:02

@无所不能的风:

  1. js中reduce、every、map这些api是吸收了FP(函数式编程)的优点引入的,这些api有一个特点,就是将函数名作为变量传入到函数中,这些函数有个专业名词叫高阶函数
  2. 函数名也是可以作为变量的,如果你学过C语言,可以类比函数指针,它跟var i = 1这种的区别在于它指向的是一个函数,函数一般是有参数的(无参可以看成是有参的特例),所以函数变量是不完整的,需要在运行时传入参数
  3. 回到sort上来,我们来自己实现一个冒泡排序方法
function bubbleSort(arr){
    for (let i = 0; i < arr.length - 1; i++) {
        for (let j = 0; j < arr.length - i - 1; j++) {
            // 顺序:如果前一个数大于后一个数,则交换
            if(arr[j] > arr[j + 1]){
                const temp = arr[j]
                arr[j] = arr[j + 1]
                arr[j + 1] = temp
            }
        }
    }
}

const array = [1, 10, 5, 2, 6, 9, 8]
bubbleSort(array)
console.log(array)
// Output: [1, 2, 5, 6, 8, 9, 10]

上面是顺序,如果需要倒序,则要将大于改成小于,其它不变。根据IoC控制反转思想,这种变化应该交给调用者。现在就变成了如何抽象这个if条件,它的输入是两个变量(分别是数组的前后两个元素),输出是一个bool,这正好可以用一个bool compare(n1, n2)函数来表示,所以可以改造成如下:

// 顺序比较
function orderedCompare(n1, n2){
    return n1 > n2 
}

// 倒序比较
function reversedCompare(n1, n2){
    return n1 < n2
}

function bubbleSort(arr, compare){
    for (let i = 0; i < arr.length - 1; i++) {
        for (let j = 0; j < arr.length - i - 1; j++) {
            if(compare(arr[j], arr[j + 1])){
                const temp = arr[j]
                arr[j] = arr[j + 1]
                arr[j + 1] = temp
            }
        }
    }
}

const array = [1, 10, 5, 2, 6, 9, 8]
bubbleSort(array, reversedCompare)
console.log(array)
// Output: [10, 9, 8, 6, 5, 2, 1]

上面的compare函数也可以用ES6箭头函数来代替简化。
大概就是这样了。

jello chen | 园豆:7306 (大侠五级) | 2019-01-01 13:02

@jello chen: 首先我应该谢谢你,占用了你的私人时间。对于你讲解的东西,我稍微了解了大概,我差的实在是太多了。谢谢你,新年快乐!

无所不能的风 | 园豆:156 (初学一级) | 2019-01-01 13:17

@无所不能的风: 新年快乐!

jello chen | 园豆:7306 (大侠五级) | 2019-01-01 14:43
其他回答(1)
0

其实这里就是一个回调函数,有的回调函数会返回一个类型的数据,我们可以用变量来接受,var xx = function(){
}这里传入的xx其实可以转化成function(){},就相当于一个匿名函数
我也不知道我说的是不是我这意思,

那就这样吧 再爱都曲终人散啦
那就分手吧 再爱都无需挣扎
不要再问我 怎舍得拱手让他

无所不能的风 | 园豆:156 (初学一级) | 2019-01-02 17:24

最近又把函数的原型看了一遍

其实我最关心的问题是:

  • js中对象调用函数或方法都是希望获得返回的结果,或者是改变某个对象的状态
    函数在调用时不加括号其实就是将函数当做指针指向该函数,结果就是将函数所有的代码搬到我们写的那里
    而加括号就是函数的调用,会执行该方法,将返回的结果,或者状态的改变呈现回来
    小白自己理解,希望不要给别人产生误解,并且希望其他人多多指正...
  • 有些方法是返回自己,值改变,有的是返回新数组,值改变,这点还是得多去理解,不能很熟练的运用..
支持(0) 反对(0) 无所不能的风 | 园豆:156 (初学一级) | 2019-01-10 11:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册