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)

İlgili makaleler