2016-03-22 23 views
0

Özet: Çok düzeyli bir ebeveyn-çocuk yorumu system.i.e var.Javascript - iç içe geçmiş bir değerle JSON nesnesini sıralama

Örnek:

comment 1 
    comment 1-1 
     comment 1-1-1 
    comment 1-2 
     comment 1-2-1 
      comment 1-2-2 
İşte

, comment 1 üstüdür ve comment 1-1 & comment 1-2 ikisi de benzeri comment 1 ve çocuğu ..

R

sorting Tüm nesnenin property value .i.e temel alınarak elde edilmesi amaçlanmaktadır. timestamp (en son yorum veya cevap en üste gelecek).

JSON Nesne i şimdiye kadar denenmiş

{ 
    "CommentText": "", 
    "CommentCreateStamp": "2016-03-22", 
    "Comments": [{ 
    "CommentText": "comment 1", 
    "CommentCreateStamp": "2016-03-09", 
    "Comments": [{ 
     "CommentText": "comment 1-1", 
     "CommentCreateStamp": "2016-03-15", 
     "Comments": [{ 
     "CommentText": "comment 1-1-1", 
     "CommentCreateStamp": "2016-03-21", 
     "Comments": null 
     }] 
    }] 
    }], 
    "Comments": [{ 
    "CommentText": "comment 2", 
    "CommentCreateStamp": "2016-03-12", 
    "Comments": [{ 
     "CommentText": "comment 2-1", 
     "CommentCreateStamp": "2016-03-10", 
     "Comments": [{ 
     "CommentText": "comment 2-1-1", 
     "CommentCreateStamp": "2016-03-14", 
     "Comments": null 
     }] 
    }] 
    }] 
} 

:

JSfiddle: https://jsfiddle.net/asceeevb/

ben stackoverflow soru çok gördük ama şartının gibi çalışmıyor.

Hemen herhangi bir yardım büyük önem taşıyacaktır. Teşekkür

+0

böylece düz bir listesini istiyorum? – georg

+0

sadece yapının kalması gerekiyorsa, aynı seviyede sıralayabilirsiniz. –

+0

@georg, düz bir liste değil. Verileri 'CommentCreateStamp' özelliğine göre sıralanmış şekilde istiyorum. En son yorumların üstte ve aynı zamanda çocuk hiyerarşisinde de olması gerekir. JSON nesnesini güncelledim. lütfen şimdi kontrol edin. –

cevap

2

ben ne soran tamamen emin değilim, ama orada koduyla yanlış görünüyor birkaç şey:

  • belki bir dizi istedik nesnenin comments özelliğini yeniden tanımlandı?
  • Sıralama fonksiyonunuzun, çıktı almayan elemanların karşılaştırmasına dayalı bir değer döndürmesi gerekir. Tarih karşılaştırması için bkz. this SO question.

Güncelleme: Sen yakındı, eksik ne iç içe yorumlar için sorting yapılan çağrılar vardı.

var people = { 
 
    "CommentText": "", 
 
    "CommentCreateStamp": "", 
 
    "Comments": [{ 
 
    "CommentText": "c1", 
 
    "CommentCreateStamp": "2016-03-23 06:05:36", 
 
    "Comments": [{ 
 
     "CommentText": "c2", 
 
     "CommentCreateStamp": "2016-03-23 06:05:59", 
 
    }], 
 
    }, { 
 
    "CommentText": "a1", 
 
    "CommentCreateStamp": "2017-03-23 06:05:45", 
 
    "Comments": [{ 
 
     "CommentText": "a2", 
 
     "CommentCreateStamp": "2016-03-23 06:06:05", 
 
    }, { 
 
     "CommentText": "a3", 
 
     "CommentCreateStamp": "2016-03-23 06:06:16", 
 
    }, { 
 
     "CommentText": "a4", 
 
     "CommentCreateStamp": "2016-03-23 06:06:23", 
 
    }], 
 
    }], 
 
}; 
 

 

 

 
function sorting(js_object, key_to_sort_by) { 
 

 
    function sortByKey(a, b) { 
 
    var x = a[key_to_sort_by]; 
 
    var y = b[key_to_sort_by]; 
 
    return ((x < y) ? 1 : ((x > y) ? -1 : 0)); 
 
    }; 
 

 
    js_object.sort(sortByKey); 
 

 
}; 
 

 
function sortComments(comments) { 
 
    
 
    sorting(comments, 'CommentCreateStamp'); 
 
    for (var i = 0; i < comments.length; i++) 
 
    if (comments[i].hasOwnProperty('Comments')) 
 
     sortComments(comments[i].Comments); 
 

 
}; 
 

 
sortComments(people.Comments); 
 
console.log(people.Comments);

+0

keman güncellendi lütfen kontrol edin. –

+0

@RohitJindal Cevabı güncelledim. – destoryer

+0

Teşekkürler .. iyi çalışıyoruz :) –

1

, başvuruyu tutan bir düz dizi yapmak ve CommentCreateStamp göre sıralayabilir olabilir: İşte yinelemeli sorting çağıran snippet'idir.

function getFlat(o) { 
 
    this.push(o); 
 
    Array.isArray(o.Comments) && o.Comments.forEach(getFlat.bind(this)); 
 
} 
 

 
var object = { "CommentText": "", "CommentCreateStamp": "2016-03-22", "Comments": [{ "CommentText": "comment 1", "CommentCreateStamp": "2016-03-18", "Comments": [{ "CommentText": "comment 1-1", "CommentCreateStamp": "2016-03-15", "Comments": [{ "CommentText": "comment 1-1-1", "CommentCreateStamp": "2016-03-21", "Comments": null }] }] }] }, 
 
    flat = []; 
 

 
getFlat.bind(flat)(object); 
 
flat.sort(function (a, b) { 
 
    return a.CommentCreateStamp.localeCompare(b.CommentCreateStamp); 
 
}); 
 
document.write('<pre>' + JSON.stringify(flat, 0, 4) + '</pre>');

+0

Cevabınız için teşekkürler, ancak sıralı nesneyi aynı formatta bir düz dizi değil istiyorum. –

0

hafifçe @changed cevabı daraltma - Aşağıdaki işleri oldukça iyi bulmak:

export function sortObj(jsObj, sortKey,flgReverse) { 
    sortKey = sortKey.split("."); 
    let sk = ''; 
    Object.keys(sortKey).forEach(function(key,idx){ 
    sk += '[\'' + sortKey[key] + '\']'; 
    }); 
    function sortByKey(a, b) { 
     var x = eval("a" + sk); 
     var y = eval("b" + sk); 
     if(flgReverse) return ((x < y) ? -1 : ((x > y) ? 1 : 0)); 
     else return ((x < y) ? 1 : ((x > y) ? -1 : 0)); 
    }; 
    return jsObj.sort(sortByKey); 
    }; 
İlgili konular