下面的代码摘自《javascript语言精粹》中的array.sort(comparefn)一节(Page81),但是我用firebug测试却产生了错误信息:missing } after property list,message: 'Expected an object when sorting by ' + name;
问题1:请教错误产生的原因?
问题2:假设错误已经修正,那么可以看作var name='last', minor=by("first"),但当by函数第二个参数为函数的时候,则返回minor(o,p)这个函数,但是minor(o,p)又是在什么地方定义的呢?(可能我的表述不清,总之就是对这段代码不能理解,请大家帮我梳理一下理解这段代码的思路。)
问题3:我对by函数返回的匿名函数的形参o,p的理解是:在这里o,p是指的数组s中的任意两个参数,如果我理解的正确,那么这个指定任意参数的规则是如何规定的,我应该去搜索什么关键词了解相关的知识点?对于数组s而言,这段by函数计算了多少次,是15次吗?如果不是,那是多少次,为什么?
window.onload = function () { var by = function (name,minor) { return function (o, p) { var a, b; if (typeof o === 'object' && typeof p === 'object' && o && p) { a = o[name]; b = p[name]; if (a === b) { return typeof minor === 'function' ? minor(o,p) : 0; } if (typeof a === typeof b) { return a < b ? -1 : 1; } return typeof a < typeof b ? -1 : 1; } else { throw { name: 'Error', message: 'Expected an object when sorting by ' + name; }; } }; }; var s = [ {first: 'Joe', last: 'Besser'}, {first: 'Moe', last: 'Howard'}, {first: 'Joe', last: 'DeRita'}, {first: 'Shemp', last: 'Howard'}, {first: 'Larry', last: 'Fine'}, {first: 'Curly', last: 'Howard'} ]; s.sort(by('first')); // s is [ // {first: 'Curly', last: 'Howard'}, // {first: 'Joe', last: 'DeRita'}, // {first: 'Joe', last: 'Besser'}, // {first: 'Larry', last: 'Fine'}, // {first: 'Moe', last: 'Howard'}, // {first: 'Shemp', last: 'Howard'} // ] var sSort = s.sort(by('last',by('first'))); console.log(sSort); }
1. 错误有:
2. 返回的 minor(o,p) 是
3. (o, p) 是数组 s 里面的任意两个对象, 这个是由 sort() 方法规定的
排序的参数是通过 by(name) 传递到 o[name] 和 p[name] 上的
进行比较的实际是 o[name] 和 p[name]
计算次数留给楼下吧... 不care性能的飘过
1.错误原因是 throw那一句里 message属性的后面不应该有";"来结束,对象定义里面不能有;的。
2.by函数只是返回一个比较算法,而minor就是在主要比较属性(name参数)相等时使用的比较函数(类似备用),这个是外面传的哦,比如最后那个s.sort(by('last',by('first'))的意思就是先按last比较,last一样就按first比较。
3.没看原书,第三个问题不怎么了解....简单测试了一下。sort貌似一个性能不错的方法,不知道用的啥比较算法(算法学得烂就不多话了),总之内部比较次数是不一定的,最小n-1次,最大是s的笛卡尔积吧