3 Вопрос: Сортировка массива объектов по имени типа

вопрос создан в Wed, May 8, 2019 12:00 AM

Используя TypeScript, я пытаюсь отсортировать массив объектов по имени фактического объекта, а не по ключу объекта. На этих объектах также существует ключ имени, который является тем же именем фактического объекта. Я пытаюсь увидеть, где я иду не так с моей логикой здесь. Я попытался отсортировать по имени ключа объекта безуспешно.

Я пытался использовать функцию .sort () несколькими способами.

Пример массива следующий:

templateReports = [

{"Project Report": {name: "Project Report", docType: "Project"}},
{"Department Report": {name: "Department Report", docType: "Department"}},
{"Room Report": {name: "Room Report", docType: "Room"}}

]

Я пробовал следующее:

templateReports.sort((a,b) => (a.name > b.name) ? 1 : ((b.name > a.name) ? -1 : 0));

Я понимаю, что это не работает, потому что для вызова ключа имени в массиве я мог бы сделать что-то вроде:

console.log(templateReports[0]["Project Report"].name);

и я получу имя для первого объекта в массиве. Так что я знаю, что мне нужно изменить, как я использую функцию источника, чтобы что-то вроде:

templateReports.sort((a,b) => (a[nameOfObject].name > b[nameOfNextObject].name) ? 1 : ((b[nameOfNextObject].name > a[nameOfObject].name) ? -1 : 0));

Я пытаюсь отсортировать его по алфавиту:

templateReports = [

{"Department Report": {name: "Department Report", docType: "Department"}},
{"Project Report": {name: "Project Report", docType: "Project"}},
{"Room Report": {name: "Room Report", docType: "Room"}}

]

Как мне а) выполнить это с помощью метода сортировки или б) сделать что-то для сортировки по фактическому имени объекта?

Спасибо.

    
0
  1. Пожалуйста, опубликуйте результат, который вы хотели бы получить.
    2019-05-08 15: 49: 15Z
  2. Я получил это для работы, выполнив следующее: this.templateReports.sort((a,b) => (Object.keys(a)[0] > Object.keys(b)[0]) ? 1 : ((Object.keys(b)[0] > Object.keys(a)[0]) ? -1 : 0));
    2019-05-08 16: 14: 26Z
3 ответа                              3                         

Когда у вас есть такой объект:

let o = {"Project Report": {name: "Project Report", docType: "Project"}}

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

o["Project Report"].name // => "Project Report"

Это создает проблему для вас, так как вы заранее не знаете, как называется единственный ключ внутри объектов, по которым вы пытаетесь отсортировать.

Но вы можете запросить объект для его ключей с помощью Object.keys():

let keys = Object.keys(o) // => ["Project Report"]

И так как вы знаете, что у вас есть только один ключ на объект в вашем списке, вы можете написать что-то вроде этого:

function getName(o) {
    return Object.keys(o)[0];
}

templateReports.sort((first, second) => getName(first).localeCompare(getName(second)));

    
1
2019-05-08 15: 55: 29Z
  1. Спасибо, это сработало.
    2019-05-08 16: 25: 43Z

Чтобы ответить на ваш вопрос, вы можете получить ключ объекта, позвонив по номеру Object.keys(obj)[0], который получит первый перечисляемый ключ. Поскольку каждый из этих объектов имеет ровно одну пару ключ-значение, это будет нормально работать. Если вы добавите вторую пару ключ-значение, это НЕ будет работать.

Тогда мой следующий вопрос: почему объекты находятся в этой конфигурации? Учитывая, что ключи объектов - это просто повторное значение name, я думаю, что было бы более разумно иметь массив только объектов, не так ли? Я не уверен, что вы получаете от того, что каждый объект вложен во второй объект.

    
0
2019-05-08 15: 55: 18Z

Это странная структура объекта.

Вы можете сделать это, но вам нужно выяснить, каким должен быть метод доступа к свойству. Как вы определяете этот ключ каждого объекта?

Вы можете использовать первый ключ в объекте: ( отказ от ответственности - это можно обслуживать?)

const accessSortingKey(object: Object): string {
    const key = Object.keys(object)[0];
    return key;
} 

const weirdArray = [
    {"Project Report": {name: "Project Report", docType: "Project"}},
    {"Department Report": {name: "Department Report", docType: "Department"}},
    {"Room Report": {name: "Room Report", docType: "Room"}}
];

weirdArray.sort((a, b) => {
   const aVal = accessSortingKey(a);
   const bVal = accessSortingKey(b);

   return aVal > bVal ? 1 : aVal < bVal ? -1 : 0;

}); р>     

0
2019-05-08 16: 02: 47Z
источник размещен Вот