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

  • Facebook Developers

    Facebook Dev

    24 ŞUBAT 2009
  • HowcastTechGadgets

    HowcastTechG

    22 EYLÜL 2010
  • soyacincautv

    soyacincautv

    14 NİSAN 2010