JavaScript: как совместить две разные, но довольно похожие функции?

В рамках этих двух функций;

  • url путь меняется.
  • Зависит от другого пути url; Функция parameters - это изменения.

Я пробовал несколько вариантов именования и использования, чтобы объединить эти функции, но безуспешно! Как я могу использовать только функцию? Заранее спасибо.

function RunTestCases (name, foo, folder, host) {
    host = host || DynamicHost();
    folder = folder || 'FooFolderPath';

    return {
        title: name,
        hostPageUrl: host,
        url: folder + foo + '/'+ name +'.T.js'
    };
}

function RunMonkeyTestCase (name, folder, host) {
    host = host || DynamicHost();
    folder = folder || 'FooFolderPath';

    return {
        title: name,
        hostPageUrl: host,
        url: folder + name +'.T.js'
    };
}

//Usage of Functions;
RunTestCases('NameParam', 'FooParam');
RunMonkeyTestCase('NameParam', 'BarFolderPath', 'BarHostParam');

//For some specific usages.
RunTestCases('NameParam', 'FooParam', 'BarFolderPath', 'BarHostParam');
RunMonkeyTestCase('NameParam', null, 'FooHostParam');
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
81
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вам нужно объединить функции в одну? Попробуй.

function Test (title, foo, folder = 'FooFolderPath', hostPageUrl = DynamicHost()) {
  return {
    title,
    hostPageUrl,
    url: folder + (foo ? foo + '/' : '') + title + '.T.js'
  };
}

//Usage of Functions;
Test('NameParam', 'FooParam')
Test('NameParam', null, 'BarFolderPath', 'BarHostParam')

Я просто редактирую свой пост: я забыл указать DynamicHost() в RunTestCase(), поэтому мне пришлось изменить ваше использование; host = host || DynamicHost(); и хорошо сработало!.

Nuri Engin 30.08.2018 15:48

а почему вы определили FooFolderPath для folder в params? Я записал его в фигурные скобки как; folder = folder || FooFolderPath` и работает нормально.

Nuri Engin 30.08.2018 15:55

это параметр по умолчанию в js. Это должно работать как folder = folder || FooFolderPatne, но более очевидно

Илья Зеленько 30.08.2018 15:57

Также я проверил опцию function Test (name, foo, folder = 'FooFolderPath', host = DynamicHost()) { и удалил host = host || DynamicHost()Вроде работает! Не могли бы вы проверить? Это более элегантный вариант

Илья Зеленько 30.08.2018 16:09

Точно! сработало и наряднее! Но вы пропустили состояние title в конфиге url;) Так и должно быть: url: folder + (foo ? foo + '/' : '') + title +'.T.js'

Nuri Engin 30.08.2018 16:23

Сохраняйте порядок параметров одинаковым в обеих функциях, а затем, наконец, добавьте foo в параметр, а затем выполните что-то вроде ниже:

function TestCase(name, folder, host, foo) {
  host = host || DynamicHost();
  folder = folder || 'FooFolderPath';
  let url;
  if (foo) {
    url = folder + foo + '/' + name + '.T.js';
  } else {
    url = folder + name + '.T.js'
  }

  return {
    title: name,
    hostPageUrl: host,
    url: url
  };

}

console.info(TestCase('NameParam', 'BarFolderPath', 'BarHostParam', 'FooParam'));

console.info(TestCase('NameParam', 'BarFolderPath', 'BarHostParam'));

console.info(TestCase('NameParam', 'FooParam', 'BarFolderPath', 'BarHostParam'));

console.info(TestCase('NameParam', 'FooHostParam'));

Вероятно, было бы немного чище, если бы вы сначала создали объект, а затем условно добавили свойство url. Это дает вам гораздо меньше дублирования и единую инструкцию возврата. Также вы пропустили их вызов DynamicHost

Marie 30.08.2018 14:54

@ Мари с тобой согласна. Пожалуйста, посмотрите сейчас

Vikasdeep Singh 30.08.2018 14:58

@VicJordan Я кое-что изменил, чтобы прицелиться и это сработало; host = host || DynamicHost(); и if (foo !== undefined) {. Нежелательным является то, что я должен был вызвать функцию с null для некоторого использования :( как RunTestCases('nameparam', null, null, 'fooparam')). Так могу ли я как-то избежать использования null?

Nuri Engin 30.08.2018 15:31

@VicJordan Я только что отредактировал свой пост: я забыл указать DynamicHost() в RunTestCase()

Nuri Engin 30.08.2018 15:47

@NuriEngin не нужно передавать null. Пожалуйста, проверьте мой обновленный ответ. Последний случай не выполняется, потому что он ищет функцию DynamicHost(), в противном случае он также будет работать, если DynamicHost() присутствует в коде.

Vikasdeep Singh 30.08.2018 15:54

@VicJordan Что, если я хочу использовать папку и хост по умолчанию? Затем нужно написать: TestCase('NameParam', null, null, 'FooParam')

Илья Зеленько 30.08.2018 16:01

Уважаемый @VicJordan, как я уже сказал, ваше предложение работает нормально, но ответ, который я принял, мне больше подходит из-за параметра foo. Спасибо за помощь.

Nuri Engin 30.08.2018 16:15

Похоже, что параметр foo является особенным. Я бы использовал его, но вам нужно изменить порядок параметров:

function RunTestCases (name, folder, host,foo) 
  {
  host = host || (foo? 'FooHostParam' : DynamicHost()) ;
  folder = folder || foo? 'FooFolderPath' : 'BarFolderPath')
  const url = (foo? (folder + foo + '/' + name +'.T.js') : (folder + name +'.T.js'));
  return {
      title: name,
      hostPageUrl: host,
     url
  };
}

в вопросе есть такой вызов функции: RunTestCases('NameParam', 'FooParam') С вашим кодом будет так: RunTestCases('NameParam', null, null, 'FooParam') но второй вариант подойдет: RunTestCases ('NameParam', 'BarFolderPath', 'BarHostParam')

Илья Зеленько 30.08.2018 15:07

Как я уже сказал, «вам нужно изменить порядок параметров», OP необходимо внести изменения, чтобы эта работа работала. То же самое касается любого другого возможного ответа. @ ИльяЗеленько

sagi 30.08.2018 15:11
function RunTest (name, folder, host, foo) {
    host = host || (foo ? DynamicHost() : 'FooHostParam');
    folder = folder || 'FooFolderPath';

    returnVal = {
        title: name,
        hostPageUrl: host,
    };

    returnVal.url = foo ? folder + name +'.T.js' : folder + foo + '/'+ name +'.T.js';

    return returnVal;
}

Вероятно, вы могли бы увеличить папку перед назначением URL-адреса, чтобы вам не нужно было иметь эту логику в наборе. Это должно избавить вас от дублирования строки расширения.

Marie 30.08.2018 14:56

Вы можете изменить значение папок перед назначением, например if (!foo) folder = folder + foo + '/';, тогда просто установите URL-адрес, например. returnVal.url = folder + name +'.T.js';

Marie 30.08.2018 15:01

разве ваше тернарное условие не смешано?

jonatjano 30.08.2018 15:03

Другие вопросы по теме