人物オブジェクトのノックアウトに観測可能な配列があります。家系の名前に基づいて人のリストを並べ替えることができるようにしたかったのです。問題は、リストに重複する姓が多数あることです。その結果、複数の名前が存在する場合、名前は見つかったとおりに表示されます。配列を名前で並べ替えることができるようにしたいのですが、名前が複数ある場合は、名前でも並べ替えてもらいます。ユーザーが姓の入力を開始するためのテキスト入力を使用しています。結果は、すべての一致を表示するテンプレートにバインドされます。
<input data-bind="value: filter, valueUpdate: 'afterkeydown'">
そして、これが私のノックアウト配列フィルターコードです:
function Item(firstname, lastname) {
this.firstname = ko.observable(firstname);
this.lastname = ko.observable(lastname);
}
var playersViewModel = {
items: ko.observableArray([]),
filter: ko.observable("")
};
var players;
$(function() {
playersViewModel.filteredItems = ko.computed(function() {
var filter = this.filter().toLowerCase();
if (!filter) {
return this.items();
} else {
return ko.utils.arrayFilter(this.items(), function(item) {
return ko.utils.stringStartsWith(item.lastname().toLowerCase(), filter);
});
}
}, playersViewModel);
$.getJSON('./players.json', function(data) {
players = data.players;
playersViewModel.players = ko.observableArray(players);
ko.applyBindings(playersViewModel);
var mappedData = ko.utils.arrayMap(players, function(item) {
return new Item(item.firstname,item.lastname);
});
playersViewModel.items(mappedData);
});
});
家系の名前のフィルタリングではこれは問題なく機能しますが、名前が重複している場合に名前の並べ替えを追加する方法を見つけることができません。たとえば、私の配列で名前で並べ替えると、次のようになります。
Joe Bailey
Jack Brown
Adam Brown
Bob Brown
Jim Byrd
重複する家系の名前にも名前を並べ替えてもらいたいのですが、次のようになります。
Joe Bailey
Adam Brown
Bob Brown
Jack Brown
Jim Byrd