Как получить имя и реквизиты глобальных объектов в Javascript

#javascript

#javascript

Вопрос:

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

 const UniversityEnums = {
studentStatus: {Enrolled: 'Enrolled', OnHold: 'OnHold', Expelled: 'Expelled'},
professorStatus: {FullTime: 'FullTime', PartTime: 'PartTime', Emeritus: 'Emeritus', Expelled: 'Expelled'}
};
  

и

 const displayStrings = {
studentStatus_Enrolled: 'Student is enrolled in the program',
studentStatus_OnHold: 'Student decided not to participate',
studentStatus_Expelled: 'Student was expelled',
professorStatus_FullTime: 'Staff member is hired fulltime',
professorStatus_PartTime: 'Staff member is hired parttime',
professorStatus_Emeritus: 'Staff member is retired',
professorStatus_Expelled: 'Staff member was expelled'};
  

Моя цель — написать функцию, которая захватывает элемент UniversityEnums и возвращает соответствующую строку отображения, например:

 const expelledStudentDispStr = getDispString(UniversityEnums.studentStatus.Expelled);
console.log(expelledStudentDispStr);
// Student was expelled
  

Имеющийся у меня в настоящее время код имеет два входных аргумента и похож на const expelledStudentDispStr = getDispString('studentStatus', UniversityEnums.studentStatus.Expelled); , которому для получения значения требуется имя перечисления, но я ищу еще более умный способ!

Заранее спасибо.

Примечание: я могу манипулировать объектом enum (например, определить его с разными именами переменных (или, может быть, добавить к нему или его дочерним элементам другие свойства). Однако я НЕ МОГУ изменить их значения, потому что эти значения используются для сравнения этих статусов с другими переменными. Кроме того, displayStrings исходят из стороннего источника, и изменить их для меня не выполнимо (по крайней мере, легко!)

Возможный обходной путь: Один из способов, который приходит мне на ум, — это изменить мой объект enum, чтобы у него были имена, соответствующие displayStrings ключам:

 const UniversityEnums = {
studentStatus: {
    studentStatus_Enrolled: 'Enrolled',
    studentStatus_OnHold: 'OnHold',
    studentStatus_Expelled: 'Expelled'},
professorStatus: {
    professorStatus_FullTime: 'FullTime',
    professorStatus_PartTime: 'PartTime',
    professorStatus_Emeritus: 'Emeritus',
    professorStatus_Expelled: 'Expelled'}
};
  

Комментарии:

1. Ну, вам нужно так или иначе передать информацию о студенте / профессоре. Вы не можете получить это из статуса, который вы присваиваете функции, потому что excluded находится в них обоих.

2. Точно, expelled вариант использования, который вы указали, является допустимым, и мне нужно их учитывать. Также, пожалуйста, обратите внимание, что я могу манипулировать universityEnums . (но ресурсы возвращаются из стороннего ресурса, которым я не могу манипулировать (по крайней мере, легко!)

3. Вы, конечно, можете перебрать свои UniversityEnums , чтобы найти правильный, но вы не смогли отличить Expelled один.

4. @Bergi Для этого варианта использования мы не можем использовать свойства объекта, чтобы выяснить, какому родителю он принадлежит? т.Е. это studentStatus или professorStatus ?

5. @AleX Нет, изменение getDispString(UniversityEnums.studentStatus.Expelled) на getDispString(UniversityEnums.studentStatus.studentStatus_Expelled) не помогает, потому что вы по-прежнему передаете значение enum, а не имя свойства.

Ответ №1:

Ваш

 getDispString(UniversityEnums.studentStatus.Expelled)
  

это то же самое, что

 getDispString("Expelled")
  

и это все равно было бы то же самое с вашим новым объектом, как

 getDispString(UniversityEnums.studentStatus.studentStatus_Expelled)
  

вы не предоставляете ему дополнительной информации, с другой стороны, вы могли бы преобразовать свое перечисление подобным образом

 const UniversityEnums = {
  studentStatus: {
    Enrolled: { 
      status: 'Enrolled',
      entity: 'student'
    },
    OnHold: { 
      status: 'OnHold',
      entity: 'student'
    },
    Expelled: { 
      status: 'Expelled',
      entity: 'student'
    }
  }
};
  

таким образом, вы бы предоставили дополнительную информацию, которая вам нужна

вы могли бы сделать что-то вроде

 for (const kind in UniversityEnums)
  for (const value in UniversityEnums[kind])
    UniversityEnums[kind][value] = {
       kind: kind,
       value: value
    }
  

из ответа Берги

Ответ №2:

Обратите внимание, что я могу манипулировать объектом enum

В таком случае это просто: просто поместите уникальные значения в перечисления, чтобы вы могли их правильно различать. Например,

 for (const kind in UniversityEnums)
  for (const value in UniversityEnums[kind])
    UniversityEnums[kind][value] = kind   '_'   value;
  

С помощью этого вы можете написать

 function getDispString(enumValue) {
  return displayStrings[enumValue];
}
  

Комментарии:

1. Позвольте мне изменить мой вопрос или добавить к нему примечание, потому что я не могу изменить значения

2. @AleX_ Что вы можете изменить? Но тогда ответ отрицательный, без изменения значений будет недостаточно передать только значение вашей getDispString функции. (Конечно, есть другие способы изменить значения более тонкими способами, которые могли бы сделать их различимыми, но их использование может остаться прежним).