Javascript Eğitim Dersleri #009

31 Mart 2008, Pazartesi

Numerik Sıralama ( Sort )

Array.sort’un en güzel özelliği, sort işlemini yaparken callBack fonksiyon çağırabilmekti. Default olarak sıralama işlemi ASCII tablosuna göre lexicographical olarak yapılır. Yani 1,11,12,2,3 gibi... callBack kullanıldığında, fonksiyon 2 parametre alır. Yani birbiriyle mukayese ( compare ) edilecek iki şey... 3 adet sonuç oluşur;

  • Eğer A > B ise; 1
  • A > B ise; -1
  • A = B ise; 0
  1. function sortNumericAscending( a , b )
  2. {
  3.  if( a > b )
  4.  {
  5.   return 1;
  6.  }
  7.  if( a < b )
  8.  {
  9.   return -1;
  10.  }
  11.  return 0;
  12. }
  13.  
  14. var myArray = Array( 1 , 5 , 2 , 11 , 3 , 8 , 12 );
  15. myArray.sort( sortNumericAscending );
  16. window.alert( myArray );
  17. // 1,2,3,5,8,11,12

Keza, numerik olarak sort ettiğimiz bu array’de, Array.reverse kullanırsak da, tersten sıralama yapmış oluruz.

  1. function sortNumericAscending( a , b )
  2. {
  3.  if( a > b )
  4.  {
  5.   return 1;
  6.  }
  7.  if( a < b )
  8.  {
  9.   return -1;
  10.  }
  11.  return 0;
  12. }
  13.  
  14. var myArray = Array( 1 , 5 , 2 , 11 , 3 , 8 , 12 );
  15. myArray.sort( sortNumericAscending );
  16. window.alert( myArray );
  17. // 1,2,3,5,8,11,12
  18. myArray.reverse();
  19. window.alert( myArray );
  20. // 12,11,8,5,3,2,1

Object Detay...

Obje’ler ( nesneler ) içerisinde pek çok değişik tipi barından bir container ( taşıyıcı ) gibidir. Daha önceki örneklerimizde, herşeyin key : value zincirlerinden oluştuğunu belirtmiştik. Tüm datalarımız String lerden oluşmuştu. ( key’ler ve value’ler ) Şimdi ise, mixed dediğimiz, içinde Array, String, Object bulunan bir OBJE yapalım!

Source Download

Gördüğünüz gibi, objemizin key’leri, String değil. Bu bakımdan, objUsers[ 'aryUsers' ] yerine, objUsers.aryUsers şeklinde bir kullanım var.

this şeklinde bir tanım var. Bu, bağlı olduğu obje’yi temsil ediyor. this.aryUsers diyerek, objUsers objesinden, key’i aryUsers olanı çağırdık! aryUsers’ın value’su ise bir Array.

Eğer objUsers[ 'aryUsers' ] desek ne olurdu?

  1. document.write( '<p>' + objUsers[ 'aryUsers' ] + '<\/p>' );

Ekranda;

  1. [object Object] , [object Object] , [object Object] , [object Object]

yazacaktı. Çünki init ederken demo için 4 adet user tanımlıydı :) Kullanıcıları, aryUsers objesine ( keza bunun karşışığı bir Array ) Array.push ile ekledik. Kullanıcıyı silerken, array içindeki index’i kullandık. Buffer yaptık, silmemiz gereken index dışındaki user’ları bu Buffer Array’e push ettik. İşimiz bitince, bu Buffer Array, artık bizim esas kullandığımız Array haline geldi. this.aryUsers = aryBuffer

Sort işlemi sırasında, dikkat ettiyseniz, sort’a parametre geçtik. Eğer parametre gelmiş ise sıralamayı DESCENDING ( yani Z’den A’ya ), değil ise ASCENDING ( yani A’dan Z’ye ) yaptık. Callback fonksiyonuna baktığımızda;

  1. return a.user_name.localeCompare( b.user_name );

Şeklinde bir ifade var. Çünki sort etmeye çalıştığımız Array içinde OBJE var, ve bu OBJE’nin key’leri ile uğraşıyoruz. Yani a ve b dediğimiz şeyler, aslında a.user_name ve b.user_name. Demekki bu sort işini, kullanıcı şifresine göre yapsaydık; a.user_password ve b.user_password kullanacaktık.

Bonus

Bonus olarak, sizlere 2 güzel döküman;