2011-06-02 18 views
6

Hay, bir dizi nesneye sahibim ve her nesnenin belirli bir özelliği tarafından (DESC veya ASC) sıralamalıyım.Nesne nesnesine ait nesnelerin bir javascript dizisini sıraya koydu

İşte Şimdi, nesnelerin tarihe göre sırayla böylece veri dizisi sipariş etmek istediğiniz veri

obj1 = new Object; 
obj1.date = 1307010000; 

obj2 = new Object; 
obj2.date = 1306923600; 

obj3 = new Object; 
obj3.date = 1298974800; 

obj4 = new Object; 
obj4.date = 1306923600; 

obj5 = new Object; 
obj5.date = 1307096400; 

data = [obj1,obj2,obj3,obj4,obj5]; 

bu.

Birisi bana yardım edebilir mi?

cevap

32

Kullanım Dizisi sort() yöntem

data.sort(function(a, b){ 
    return a.date - b.date; 
}); 
4

bu deneyin:

data.sort(function(a,b){ 
    return a.date - b.date; //to reverse b.date-a.date 
}); 
1

Sen özel bir sıralama işlevi kullanabilirsiniz:

function mySort(a,b) { 
    return (a.date - b.date); 
} 
data.sort(mySort); 
3

Bu çözüm her veri türü ile çalışır:

sort_array_by = function(field, reverse, pr){ 
    reverse = (reverse) ? -1 : 1; 
    return function(a,b){ 
    a = a[field]; 
    b = b[field]; 
    if (typeof(pr) != 'undefined'){ 
     a = pr(a); 
     b = pr(b); 
    } 
    if (a<b) return reverse * -1; 
    if (a>b) return reverse * 1; 
    return 0; 
    } 
} 

Sonra bu gibi kullanmak (bir çeşit geri):

data.sort(sort_array_by('date', true, function(a){ 
    return new Date(a); 
})); 

Başka bir örnek olarak, "tamsayı" türünde bir özellik göre sıralayabilir:

data.sort(sort_array_by('my_int_property', true, function(a){ 
    return parseInt(a); 
})); 
0

Bu bir örnektir "Sırasıyla", "array" nesnesinin sıralama düzenini nasıl kullanacağımı, bir object.copy dizininin bir script etiketinde yapıştırıldığını ve konsolda çalışmayı anlayabildiğini görüyoruz ...

function OBJECT(){ 
    this.PROPERTY1 =Math.floor(Math.random()*10+1) ; 


} 

OBJECT.prototype.getPROPERTY1=function(){ 
    return(this.PROPERTY1); 
} 
OBJECT.prototype.setPROPERTY1=function (PROPERTY){ 
    this.PROPERTY1=PROPERTY; 
} 

var array= new Array(); 
console.log("unsorted object") 
for(var a=0;a<10;a++) 
{ 
array.push(new OBJECT()); 
console.log(array[a].getPROPERTY1()) 
} 


function sorting() { 
    for(var i in array){ 
     array[i].setPROPERTY1((array[i].getPROPERTY1()*1)) 
      //that is just for sorting an integer value escape this line if not an          
      //integer property 
    } 

    var arr=new(Array); 
    var temp1=new(Array); 
    for(var i in array){ 
     temp1.push(array[i]); 
    } 
    var temporary=new(Array) 
    for(var i in array) 
    { 
     var temp = array[i].getPROPERTY1(); 
     arr.push(temp); 
    } 
    arr.sort(function(a,b){return a-b}); 
    //the argument above is very important 

    console.log(arr) 
    for(var i in arr){ 

     for(var j in temp1) 
      if(arr[i]==temp1[j].getPROPERTY1()) 
       break; 

     temporary.push(temp1[j]) 


     temp1.splice(j,1)//just this statement works for me 

    } 
    array.length=0; 
    for(var i in temporary) 
    { 
     array.push(temporary[i]) 
    } 



} 


    sorting(); 
     console.log("sorted object") 
for(var a=0;a<10;a++) 
{ 
      console.log(array[a].getPROPERTY1()) 
} 
0

Bu yanıtı ekledim çünkü yinelenenleri işaretlerken bu iş parçacığı başvuruyor ve bazı yeni ve daha temiz çözümler şu anda kullanılabilir.

Başka bir çözüm, Lodash gibi bir yardımcı program kitaplığı kullanmak ve Collection#sortBy işlevini kullanmaktır. Çok temiz kod üretir ve daha az hatayla sonuçlanan daha işlevsel bir programlama stilini destekler. Bir bakışta, kodun amacı ne olursa olsun netleşir.

var sortedObjs = _.sortBy(data, 'date'); 

diğer bilgiler:

OP'ın sorunu basitçe çözülebilir? Örneğin. Biz iç içe nesneyi şu var: Artık uydurulması gereken mülkiyet yolunu belirtmek için _.property steno user.age kullanabilirsiniz

var users = [ 
  { 'user': {'name':'fred', 'age': 48}}, 
  { 'user': {'name':'barney', 'age': 36 }}, 
  { 'user': {'name':'fred'}}, 
  { 'user': {'name':'barney', 'age': 21}} 
]; 

. Kullanıcı nesnelerini yuvalanmış yaş özelliğine göre sıralayacağız. Evet, yuvalanmış mülk eşleştirmesine izin veriyor!

var sortedObjs = _.sortBy(users, ['user.age']); 

Tersine mi almak istiyorsunuz? Sorun değil. _.reverse kullanın.

var sortedObjs = _.reverse(_.sortBy(users, ['user.age'])); 

Her ikisi de Chaining kullanarak birleştirmek ister misiniz?

var sortedObjs = _.chain(users).sortBy('user.age').reverse().value(); 
İlgili konular