Вы должны определить, какой переданный аргумент, если есть, является опциями. К счастью, это не так сложно: если передан аргумент options, он будет объектом, а не функцией, и будет следовать за другим объектом. Перебирайте аргументы, начиная с первого. Если обнаружен нефункциональный объект, установите флаг. Если найден другой нефункциональный объект, это options
- измените его при необходимости. В противном случае вам нужно вставить параметры по умолчанию в правильную позицию, что можно сделать, проверив, является ли последний аргумент функцией или нет:
const changeOptions = (...args) => {
const defaultOptions = { "mydefault": "options" };
let propertiesArgFound = false;
for (const [index, arg] of args.entries()) {
if (typeof arg === 'object') {
if (propertiesArgFound) {
// This is the options object, mutate it:
args[index] = { ...defaultOptions, ...arg };
return args;
} else {
propertiesArgFound = true;
}
}
}
// Options object was not found, add it to the argument list
// either at the last position, or at the next-to-last position:
if (typeof args[args.length - 1] === 'function') {
args.splice(args.length - 1, 0, defaultOptions)
} else {
args.push(defaultOptions);
}
return args;
};
const analyticsPage = (...args) => {
const newArgs = changeOptions(...args);
// analytics.page(newArgs);
console.log(newArgs);
};
analyticsPage('foo', 'bar', { property: 'baz' });
analyticsPage('foo', 'bar', { property: 'baz' }, { someOption: 'option' });
analyticsPage('foo', 'bar', () => 'callback');