Как сделать именованные значения массива условными?
Здесь, в приведенном ниже коде, у меня есть массив params, к которому я добавляю еще один именованный параметр в условиях if. В условии if, которое говорит INSERT, я хочу иметь поля userId и displayName, а в условии, которое говорит REMOVE, мне нужно только поле userId.
Весь смысл в том, чтобы код выглядел чище, не повторяя один и тот же код дважды, а размещая его в одном месте и делая displayName условным в зависимости от того, является ли оно условием INSERT или REMOVE. В моем фактическом коде гораздо больше условий, и он выглядит очень длинным, повторяя его в каждом из этих условий if.
var params = {
secretArn: 'secretArn',
resourceArn: 'resourceArn',
database: 'db',
};
if (record.eventName == 'INSERT') {
params.parameters = [{
name: "userId",
value: {
"stringValue": userId
}
},
{
name: "displayName",
value: {
"stringValue": displayName
}
},
];
}
if (record.eventName == 'REMOVE') {
params.parameters = [{
name: "userId",
value: {
"stringValue": userId
}
},
{
name: "displayName",
value: {
"stringValue": displayName
}
},
];
}
Конечно, я могу это сделать, но я не это имел в виду. Даже если это функция, я должен сделать поле displayName массива параметров условным. Это то, чего я пытаюсь достичь.
Извините, до сих пор не следил. Условно как? Я вижу только одну определенную переменную, которая называется displayName.
Массив параметров имеет идентификатор пользователя и отображаемое имя. Я хочу сделать значение displayName условным для некоторых условий if.
У вас уже есть условия if INSERT и if REMOVE as if. Вы говорите, что у вас есть другие условия if? Как будут определяться разные значения для displayName?
Да, у меня есть другие условия if, и не всем условиям if требуется значение displayName.
Давайте продолжить обсуждение в чате.
Извините, я начал чат, но понял, что мне нужно уйти сейчас. Придется делать через некоторое время.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


После размышлений о Q кажется, что основным решением должна быть реализация шаблона динамической диспетчеризации (могу ошибиться в названии шаблона). Вот пример решения:
const getUserId = () => Math.ceil(Math.random() * 100);
const getDisplayName = () => {
const names = ['Sebastian', 'Farrell', 'Artur', 'Geghard', 'Matevos'];
return names[Math.floor(Math.random() * names.length)];
};
const makeParametr = (name, stringValue) => () => ({
name,
value: { stringValue },
});
const dispatcher = {
INSERT: [
{ func: makeParametr, args: [() => 'userId', getUserId] },
{ func: makeParametr, args: [() => 'displayName', getDisplayName] },
],
REMOVE: [
{ func: makeParametr, args: [() => 'userId', getUserId] },
],
};
const getParameters = (eventName) => {
if (!dispatcher[eventName]) throw new Error(`No such event: ${eventName}`);
return dispatcher[eventName].map(({ func, args }) => {
const currentArgs = args.map((arg) => arg());
return func(...currentArgs)();
})
};
console.info(getParameters('INSERT'));
console.info(getParameters('REMOVE'));
console.info(getParameters('OTHER_EVENT'));.as-console-wrapper{min-height: 100%!important; top: 0}Спасибо Александр. Я должен изучить это подробно. Похоже, это то, как я должен пойти переписать.
Честно говоря, я изо всех сил пытаюсь следовать вашему вопросу, но, исходя из моих догадок, почему бы вам не вызвать функцию для вставки и удаления. Что-то вроде -> if (record.eventName == 'INSERT') {callInsertFunction()} if (record.eventName == 'REMOVE') {callRemoveFunction()}. Внутри каждой функции вы можете работать с параметрами по своему усмотрению.