Nakavt Gözlemlenebilir bir Dizi sıralama
Kişi nesneleri Nakavt gözlemlenebilir bir dizi var. Kişiler son adına göre sıralamak için mümkün istedim. Sorun listesinde geçen isimler yinelenen bir numarası vardır. Sonuç birden fazla soyadı, ilk isim bulunmuş gibi görünür. Soyadına göre diziyi sıralamak mümkün olmak istiyorum ve birden fazla soyadı var, o da ilk adı göre sıralama var. Kullanıcı için bir metin giriş soyadını yazmaya başlayın kullanıyorum. Sonuçlar tüm maçları gösteren bir şablon bağlıdır.
<input data-bind="value: filter, valueUpdate: 'afterkeydown'">
Ve burada Nakavt dizi filtre kodum:
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);
});
});
Soyadı için bu işleri iyi filtreleme, ama son yinelenen adları vardır, ilk Adı Sıralama eklemek için bir yol bulmak mümkün değil. Soyadına göre sıralanmış zaman benim dizideki örneğin, alıyorum:
Joe Bailey
Jack Brown
Adam Brown
Bob Brown
Jim Byrd
İlk onların isimleri de sıralanmış olması soyadları çoğaltmak istiyorum
Joe Bailey
Adam Brown
Bob Brown
Jack Brown
Jim Byrd
CEVAP
Gözlemlenebilir dizi sıralama fonksiyonu teklif KnockoutJS, bu nispeten kolay UI (ne olursa olsun verilerin doğal düzenin.) veri sınırlama bir dizi sıralamak için yapar
data-bind="foreach: items.sort(function (l, r) { return l.lastName() > r.lastName() ? 1 : -1 })"
Eğer bağlama (ya da bir tür nedeniyle yeniden birleştirme) yapıyorsun o zaman yanlış önce sıralama iseniz öncesi sıralama yeniden sıralamak kaynak veri/, olmamalıdır.
O, ne istediğinin iki veri, soyadı, sonra ilk isim sıralamak için olduğunu söyledi.
"L.yerine() soyadı >r.(soyadı ? 1 : -1" bir düşünün
l.lastName() === r.lastName()
? l.firstName() > r.firstName() ? 1 : -1
: l.lastName() > r.lastName() ? 1 : -1
Bu daha verimli, eminim olabilir. Temelde oyunda üç koşul vardır:
- Soyadları Eşittir?
- Eğer öyleyse, ilk isimleri karşılaştırın ve dönüş sonucu.
- Başka soyadını karşılaştırın ve dönüş sonucu.
Kodunuzu taradım ve böyle bir sıralama işlevi görüyorum.
Bu benzer Michael en İyi cevabı, ancak, yaptım çalıştı netleştirmek NEREDE tanıtıcı sıralama (senin bağlama, ilk örnek) ve NASIL elde etmek için sıralama aradığınız birden fazla veri.)
data-bind="foreach: items().sort(function (l, r) { return (l.lastName() == r.lastName()) ? (l.firstName() > r.firstName() ? 1 : -1) : (l.lastName() > r.lastName() ? 1 : -1) })"
Doğal olarak, bu size daha fazla çeşit vektörler tanıtmak gibi, ters ya da ek veri gibi, ve yukarıdaki değerlendirme yapan bir filtre işlevi uygulamak gerekir: hantal alabilirsiniz
data-bind="foreach: items().sort(my.utils.compareItems)"
JavaScript nesneleri bir dizi sıralama...
En hızlı sıralama uzunluğu 6 int dizi ...
Java nasıl bir Liste için bir dizi sır...
Ruby azalan bir dizi sıralama...
Ad ile dizi sıralama (alfabetik olarak...