javascript - 关于比较函数的问题
问题描述
function createComparisonFunction(propertyName) { return function(object1,object2) {var value1 = object1[propertyName];var value2 = object2[propertyName]; if(value1 < value2) { return -1;} else if(value1 > value2) { return 1;} else { return 0;} }};这是红宝书中一个知识点,这段代码不是太明白
问题解答
回答1:这是为了比较特定数据结构而制造的工具函数。例如数据结构格式为:
let arr = [{ name: ’foo’, value: 123 }, { name: ’bar’, value: 456 }]
这时,一般的 sort 方法需要这么编写,形如:
arr.sort(function (a, b) { return a.value - b.value > 0 ? 1 : -1 })
这段代码存在的问题:
硬编码了 value 参数,排序其它字段时必须重新编码。
返回 1 / -1 的逻辑是冗余而无聊的。
直接编写排序的匿名函数,在红宝书的年代可读性不够好(现在有箭头函数,其实问题不大)。
所以对上面的 case,红宝书作者设计了一个通用的工具函数,以生成一个【用于排序特定字段】的函数。注意你调用这个工具函数,返回的是一个新函数,而不是排序的结果(所谓高阶函数)。
应用这个封装后,代码形如:
// 创造一个【根据 value 字段来排序】的函数let compareFn = createComparisonFunction(’value’)// 将创造的函数传入 sort 中作为排序依据arr.sort(compareFn)
这就起到了简化业务逻辑的作用。
回答2:什么不明白, 就是比较两个对象某个属性的大小createComparisonFunction('test')({’test’: 1}, {'test': 2})返回的是-1
回答3:调用函数时,分为两步来看。首先通过createComparisonFunction()传入比较的字段。在createComparisonFunction()函数内,返回一个匿名函数。同时由于匿名函数处在createComparisonFunction()内,所以你对createComparisonFunction()传入的参数propertyName对匿名函数也有效存在。通过上一步,你已经得到的匿名函数包含propertyName,此时你就可以传入你要比较的两个对象,在函数内比较他们的propertyName属性,返回比较结果。
回答4:这个就叫高阶函数。
相关文章:
1. PHP中的$this代表当前的类还是方法?2. javascript - vue2.0中使用vue2-dropzone的demo,vue2-dropzone的github网址是什么??百度不到。3. html5 - 目前 公司App 嵌入H5页面 做个 手机支付功能 没有做过 所以 请求各位有经验的 给个思路4. IOS app应用软件的id号怎么查询?比如百度贴吧的app-id=4779278135. javascript - 用swiper.js实现h5多篇文章滑动 点击文章跳转全文是另外的页面 点击返回滑动界面怎么定位到相应的swiper_slide6. javascript - avalon.js ms-on 事件绑定无效 ?7. java - butterknife怎么绑定多个view8. 鼠标过导航标签时,无效果,请问如何查找问题9. html - 这种错位的时间轴怎么布局,然后用css实现?10. java - spring-data Jpa 不需要执行save 语句,Set字段就可以自动执行保存的方法?求解