javascript - Nesnelerden oluşan özyinelemeli diziyi sıralama
Benim bu sınıfım var:
Node {
sortOrder: number;
children: Node[];
}
Ve onları sortOrder ile özyinelemeli olarak sıralamak istiyorum. Kendi yöntemimi denedim ama işe yaramadı.
Bunun için bir alternatif var mı?
Kod :
nodes.sort(this.compareSortOrder);
private compareSortOrder(a, b) {
if (a.children.length > 1) {
a.children.sort(this.compareSortOrder);
}
if (a.sortOrder < b.sortOrder) {
return -1;
}
if (a.sortOrder > b.sortOrder) {
return 1;
}
return 0;
}
Cevap #1
Bence b.Children üzerinde sıralamayı atlıyorsunuz. Ve a ve b'yi a.sortOrder - b.sortOrder kullanarak karşılaştırabilirsiniz.
Bu karşılaştırıcı fonksiyondur:
const comparator = (a: node, b: node) => {
if (a.Children && a.Children.length > 1) {
a.Children.sort(comparator)
}
if (b.Children && b.Children.length > 1) {
b.Children.sort(comparator)
}
return a.sortOrder - b.sortOrder;
}
Ve nodes öğelerini şuna göre sıralayın:
nodes.sort(comparator)
Tam örneğimi burada görebilirsiniz
Cevap #2
Zaten belirtildiği gibi, bir karşılaştırıcı fonksiyonunda yan etkiler yapmak kötü bir fikirdir, Bunun yerine bu kodu deneyin:
function compareSortOrder(a, b) {
if (a.sortOrder < b.sortOrder) {
return -1;
}
if (a.sortOrder > b.sortOrder) {
return 1;
}
return 0;
}
function sort(array, compareSortOrder) {
if (array && array.length > 1) {
array.sort(compareSortOrder);
for (const item of array) {
sort(item.children, compareSortOrder);
}
}
}
sort(nodes, compareSortOrder)
