Как сохранить функцию сортировки и получить ее из бд

#json #angular #typescript

Вопрос:

У меня в приложении angular есть компонент с таблицей, который получает определение столбца с данными с сервера. В определениях столбца базы данных хранятся в jsonb. Класс в приложении angular имеет следующее определение:

 export class Table {
  id: number;
  name: string;
  columnsDefinition: ColumnDefinition[];
}

export class ColumnDefinition {
  key: string;
  title: string;
  sortOrder: NzTableSortOrder | null;
  sortFn: NzTableSortFn | null;  // store function for sorting column
  sortFnString: string;  // this is function in string that i get from db
}
 

Какую функцию я должен использовать для приведения строки к типу NzTableSortOrder?
Я пытался (просто набросок)

 tables.pipe(
  map(tables => { 
    tables.map(t => { 
      t.columnsDefinition.map(definition => { 
        definition.sortOrder = JSON.parse(definition.sortFnString) 
      }) 
    }) 
}))
 

Но есть исключение «Неожиданный токен ( в JSON»
В примерах типа библиотеки NzTableSortFn имеет следующее определение:

 sortFn: (a: DataItem, b: DataItem) => a.name.localCompare(b.name) // for sort by name
 

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

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

1. Боюсь, что JSON на самом деле не поддерживает функции..?

2. Каково содержание definition.sortFnString, возвращенного из значения трассировки API, в нем перед анализом, затем введите его здесь, чтобы дважды проверить, является ли он допустимым форматом json

Ответ №1:

Хранение функций в БД может быть опасным, и существуют некоторые ограничения. Однако вы можете это сделать. Например, вы можете сохранить функцию сравнения в виде строки "(a, b) => a > b" и преобразовать строку в функцию с помощью eval: eval("(a, b) => a > b")