Nakavt Gözlemlenebilir bir Dizi sıralama | Netgez.com
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

  • EatingIn

    EatingIn

    12 EKÄ°M 2013
  • Electro Posé

    Electro PosÃ

    21 ÅžUBAT 2013
  • lane182videos

    lane182video

    6 EKÄ°M 2011