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)これはタイプミス(おそらくコードが実行されたと思います)ですか、それとも「最近の」(過去5〜6年に実装された)JavaScriptの別の変更ですか?
(2) 著者の下には、「ソート方法が安定していないため、
s.sort(by('first')).sort(by('last'));
正しいシーケンスを生成する保証はありません。」
それは本当に安定したソートのことですか? http://en.wikipedia.org/wiki/Category:Stable_sorts この本の中で起こっているのは 2 つの連続した並べ替えであり、これらが適切な順序で並べ替えられる可能性はあまりないと思いますが、これは概念とは関係ないと思います「安定したソート」の。それは...ですか?
次の 2 つの名前を想像してください。
[
{ first: "Alfred", last: "Williams" },
{ first: "Barbara", last: "Charles" }
]
名で並べ替えると、Alfred が常に最初になります。姓で並べ替えると、Barbara が常に最初になります。だから...もしそうなら:
s.sort(by('first')).sort(by('last'));
結果は、最後に並べ替えた基準にのみ依存します (この場合、姓で最後に並べ替えます)。
私は何かを誤解していますか (わかりました、私は最近安定した並べ替えについて考えていないことを認めます) つまり、ここで言及されている安定した並べ替えは何ですか?