сортировка массива, где второе свойство может отсутствовать - PullRequest
0 голосов
/ 29 августа 2018

Мне нужно отсортировать таблицу для углового проекта. Суть в том, что для некоторых значений в таблице мне нужно отсортировать по прямому свойству объектов в массиве, но для других мне нужно отсортировать по потомку этого прямого свойства.

Например, у меня есть associate.lastname для одного столбца и associate.client.name для другого столбца. Я пытаюсь сделать все это одним методом, и у меня есть рабочий метод в TypeScript.

Это метод sortBy в классе моего компонента:

sortBy(option: SortOption, sortedBy: string) {
    const props = option.split('.');
    const parent = props[0];
    const child = props[1];
    const asc = this[sortedBy];
    if(!child) {
        this.associates.sort((associateA, associateB)=> {
            if (associateA[parent] < associateB[parent]) {
                return asc === true ? -1 : 1;
            } else if (associateB[parent] < associateA[parent]) {
                return asc === true ? 1 : -1;
            } else {
                return 0;
            }
        });
    } else {
        this.associates.sort((associateA, associateB)=> {
            if (associateA[parent][child] < associateB[parent][child]) {
                return asc === true ? -1 : 1;
            } else if (associateB[parent][child] < associateA[parent][child]) {
                return asc === true ? 1 : -1;
            } else {
                return 0;
            }
        });
      }
      this[sortedBy] = !this[sortedBy]
}

SortOption - это перечисление, и значение может содержать или не содержать .. Я разделил этот период, чтобы получить родительские и дочерние свойства, а затем отсортировал массив по тому, существует ли родительский или дочерний.

Теперь мне интересно, есть ли лучший, более сухой способ сделать это. Вы заметите, что код в операторах if и else практически одинаков, за исключением того, используется ли дочернее свойство или нет, но я не могу придумать более чистого способа сделать это.

Есть ли лучший способ?

1 Ответ

0 голосов
/ 29 августа 2018

Возможно, вы захотите извлечь функцию ключа сортировки:

let sortingKey: (associate: any) => number;  // or some other type, depends on your code
if (child) {
    sortingKey = (associate) => associate[parent][child];
} else {
    sortingKey = (associate) => associate[parent];
}

После этого вы сможете просто написать:

this.associates.sort((associateA, associateB)=> {
    if (sortingKey(associateA) < sortingKey(associateB)) {
        return asc === true ? -1 : 1;
    } else if (sortingKey(associateB) < sortingKey(associateA)) {
        return asc === true ? 1 : -1;
    } else {
        return 0;
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...