Работа с XML в JavaScript

Я разбираю XML Schema на JavaScript и затем упаковываю это в объект для отправки на сервер.

Схема выглядит следующим образом:

<complexType name='Sample'>
    <sequence>  
        <element name='field' type='string'/>
        <element name='specificSetting' type='tns:SpecificType'/>
    </sequence> 
</complexType>
<complexType name="SpecificType">
    <choice>   
         <element name='A' type='tns:TypeA'/>
         <element name='B' type='tns:TypeB'/>
         <element name='C' type='tns:TypeC'/>
         <element name='D' type='tns:TypeD'/>
    </choice>
</complexType>

<complexType name="TypeA">
    <element name='fieldTypeA' type='string'/>
</complexType>

<complexType name="TypeB">
     <element name='fieldTypeB' type='string'/>
</complexType>

Я читаю эту схему и пытаюсь сформировать запрос.

const request = { 
    field:  value1,
    specificSetting: value2
}

Как мне корректно создать объект запроса для выбора? В зависимости от типа нужно упаковать объекты либо TypeA, либо TypeB, либо TypeC, либо TypeD. Как это лучше сделать?

Можно сделать так - создать объект с функциями для каждого типа:

const typeHandlers = {
TypeA: v => ({ A: { fieldTypeA: v } }),
TypeB: v => ({ B: { fieldTypeB: v } }),
TypeC: v => ({ C: { fieldTypeC: v } }),
TypeD: v => ({ D: { fieldTypeD: v } })
};

function createRequest(field, type, value) {
return {
field,
specificSetting: typeHandlerstype
};
}

Потом просто вызывать createRequest с нужными параметрами. Гибко и легко расширять.

привет! у меня был похожий кейс, решил его так - создал объект с функциями для каждого типа:

const typeHandlers = {
TypeA: (value) => ({ A: { fieldTypeA: value } }),
TypeB: (value) => ({ B: { fieldTypeB: value } }),
TypeC: (value) => ({ C: { fieldTypeC: value } }),
TypeD: (value) => ({ D: { fieldTypeD: value } })
};

function createRequest(field, type, value) {
return {
field,
specificSetting: typeHandlerstype
};
}

потом просто вызываешь createRequest с нужными параметрами. удобно и гибко, можно легко добавлять новые типы. надеюсь, поможет!

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

const specificSettingFactory = {
  TypeA: (value) => ({ A: { fieldTypeA: value } }),
  TypeB: (value) => ({ B: { fieldTypeB: value } }),
  // и так далее для C и D
};

function createRequest(field, type, value) {
  return {
    field,
    specificSetting: specificSettingFactory[type](value)
  };
}

Это позволяет легко добавлять новые типы и упрощает тестирование.