SORU
4 EKİM 2012, PERŞEMBE


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
25 Ocak 2013, Cuma


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:

  1. Soyadları Eşittir?
  2. Eğer öyleyse, ilk isimleri karşılaştırın ve dönüş sonucu.
  3. 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)"

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FrankJavCee

    FrankJavCee

    29 Kasım 2008
  • Jason Rosolowski

    Jason Rosolo

    25 EKİM 2006
  • PUSHER

    PUSHER

    11 HAZİRAN 2014