名称:挑战看200 个npm模块源码:第3个
目录:
一、介绍
二、个人手写
1、个人未看源码思路
2、个人手写代码
三、源码分析
1、源码思路
四、总结
字数:大约700字
一、介绍
名称:is-sorted
地址:https://github.com/dcousens/is-sorted.git
示例:
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、个人手写代码
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!");
}
};
测试
✅
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],正序的话后面的肯定比前面的大或者等于,如果相减为负数就不成立,满足就是正序。这个挺简单。接下来看看源码。一起学习。
三、源码分析
源码:
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,肯定不对啦。不过这个模块,它的想法估计是理想情况啦。
checksort([999, undefined, 2])
// true
四、总结
1、用了throw抛错就可以不用else。也就是断言
2、没必要用ifelse来接受外面的参数,用|| &&等运算符代替也是很好的方法。所以在减少ifelse的解决方案中,这个也是一个方法。
3、内部自定义函数和外面传进来的函数保持一致。