var by = function (name) {
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 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'}
// ]
当我实际执行此代码时,在排序后的数组中,Joe DeRitta 出现在 Joe Besser 之后,这更有意义,因为这是它们在原始数组中出现的顺序。作者说 DeRita 在排序数组中排在 Besser 之前。我在本书的勘误表中没有找到这个。
(1)这是一些错字(我怀疑,我猜代码已经运行)还是只是 JavaScript 中“最近”(在过去 5-6 年内实施)变化的另一件事?
(2) 下面作者说:“排序方法不稳定,所以:
s.sort(by('first')).sort(by('last'));
不能保证产生正确的序列。”
这真的是稳定排序的意义所在吗? http://en.wikipedia.org/wiki/Category:Stable_sorts 我认为书中发生的事情是两个连续的排序,并且没有太多机会按正确的顺序排序,但我认为这与概念无关的“稳定排序”。是吗?
想象一下这两个名字:
[
{ first: "Alfred", last: "Williams" },
{ first: "Barbara", last: "Charles" }
]
如果我们按名字排序,Alfred 将永远是第一个。如果我们按姓氏排序,芭芭拉永远是第一位的。所以......如果我们这样做:
s.sort(by('first')).sort(by('last'));
结果将仅取决于我们最后排序的内容(在这种情况下,我们按姓氏排序)。
我是不是误解了什么(好吧,我承认我最近没有考虑过稳定排序),即这里提到的稳定排序是什么?