Сортировка массива объектов по имени типа - PullRequest
0 голосов
/ 08 мая 2019

Используя 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"}}

]

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

Спасибо.

Ответы [ 3 ]

1 голос
/ 08 мая 2019

Если у вас есть такой объект:

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

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

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

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

Но вы можете запросить объект для его ключей с помощью 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)));

0 голосов
/ 08 мая 2019

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

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

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

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 голосов
/ 08 мая 2019

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

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

...