Skip to content

名称:挑战看200 个npm模块源码:第3个

目录:

一、介绍

二、个人手写

  1、个人未看源码思路
  
  2、个人手写代码
  
三、源码分析

  1、源码思路
  
四、总结

字数:大约700字

一、介绍

名称:is-sorted

地址:https://github.com/dcousens/is-sorted.git

示例:

js
const sorted = require('is-sorted')

console.log(sorted([1, 2, 3]))
// => true

console.log(sorted([3, 1, 2]))
// => false

// supports custom comparators
console.log(sorted([3, 2, 1], function (a, b) { return b - a }))
// => true

二、个人手写

同样的,如果是我们自己手写,你应该怎样写,请思考1分钟继续往下面看。或者你看看我没有看过这个源码之前我的写法是怎样的。10分你能给我几分?

1、个人未看源码思路

这里默认参考js中的sort方法。

1、首先判断是否为数组

2、默认为正序,如果传了第二个参数,排序方式按第二个参数。

3、如果是正序,判断n+1是否>= n即可。倒序则反。

按照这个思路,我们实现的代码是这样的:

2、个人手写代码

js
const isSorted = (list, fn) => {
  if (Array.isArray(list)) {
    for (let i = 1, length = list.length; i < length; ++i) {
      if (fn) {
        if(fn(list[i - 1],list[i]) > 0) {
          return false;
        }
      } else {
        if (list[i - 1] - list[i] > 0) {
          return false;
        }
      }
    }
    return true;
  } else {
    throw new Error("not a Array!");
  }
};

测试

js

isSorted([1, 2, 3])

isSorted([3, 1, 2])

isSorted([3, 2, 1], function (a, b) { return b - a })

这样,我们的代码就写出来了,为什么说默认是正序的list[i - 1] - list[i] > 0,如[1,2,3],正序的话后面的肯定比前面的大或者等于,如果相减为负数就不成立,满足就是正序。这个挺简单。接下来看看源码。一起学习。

三、源码分析

源码:

js
function defaultComparator (a, b) {
  return a - b
}

function checksort (array, comparator) {
  if (!Array.isArray(array)) throw new TypeError('Expected Array, got ' + (typeof array))
  comparator = comparator || defaultComparator

  for (let i = 1, length = array.length; i < length; ++i) {
    if (comparator(array[i - 1], array[i]) > 0) return false
  }

  return true
}

1、源码思路

1、首先判断是否为数组,不过是在前面判断,if(!) throw,从这里可以学到的是,throw抛出错误之后,就不会执行下面的代码了,所以就可以避免使用多的else啦,用官方的语言就是断言。错误提示语更官方。

2、写一个默认正序函数和传进来的函数||,这样就是,如果没有传进来,就用自己的正序函数,传了就用传进来的判断顺序函数。内部自己的判断顺序函数要和外面,当然不只是当前情况函数,各种情况下也应该有这些思想。

3、给对应函数传入参数,判断是否满足正反序。不满足就false,不过这个地方它判断有点问题,如果我像下面这样传,他返回true,肯定不对啦。不过这个模块,它的想法估计是理想情况啦。

js
checksort([999, undefined, 2])
// true

四、总结

1、用了throw抛错就可以不用else。也就是断言

2、没必要用ifelse来接受外面的参数,用|| &&等运算符代替也是很好的方法。所以在减少ifelse的解决方案中,这个也是一个方法。

3、内部自定义函数和外面传进来的函数保持一致。