В рамках конвейера ETL я конвертирую данные JSON в модель вложенных классов. Модели предоставляют методы, соответствующие свойствам, которые я в конечном итоге хочу преобразовать в JSON и записать в индекс Elasticsearch. Сериализация классов в JSON занимает очень много времени, и мне интересно, существует ли очевидный способ оптимизировать этот процесс.
Это упрощенная схема взаимодействия моделей:
class ParentModel {
children () {
this.rawChildren.map(child => new ChildModel(rawChild))
}
property1(){
// some logic to build out the property
}
property2(){
// some logic to build out the property
}
}
И дочерняя, и родительская модели наследуются от базовой модели с помощью следующего метода преобразования моделей в JSON для отправки в эластичный поиск:
modelToJson () {
// Apply to-json to this object:
const plainObject = baseToJSON(this)
// Recursively apply to-json to any child entity that implements toJson:
Object.entries(plainObject).forEach(([key, value]) => {
// Handle case where ES model method returns a single ES model:
if (value && value.toJson) {
plainObject[key] = value.toJson()
// Handle case where ES model method returns an array of ES models:
} else if (Array.isArray(value) && value.some((v) => v && v.toJson)) {
plainObject[key] = value.map((subModel) => subModel && subModel.toJson())
}
})
return plainObject
}
const baseToJSON = (model) => {
const methods = _publicMethods(model)
const objectToJson = {}
methods.forEach((method) => {
// Initialize the property first so that the resulting object keys are
// created in the same alpha-sorted order they're found, even if some of
// the values are returned async:
objectToJson[method] = null
// Call the model method, awaiting if async:
objectToJson[method] = model[method]()
// If method returns null, don't include property:
if (objectToJson[method] === null) delete objectToJson[method]
})
return objectToJson
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... ain-object