Лучший способ динамически создать оператор if в JavaScript? - PullRequest
0 голосов
/ 27 сентября 2018

Я пишу сценарий AdWords, который будет использоваться в агентстве и требует от пользователей изменения переменной, которая представляет собой массив, содержащий определенные вещи, которые необходимо исключить, поэтому мне нужно создать оператор if, который исключает все эти,

Я не могу знать заранее, сколько элементов будет на самом деле в массиве, поэтому я в настоящее время создал это:

  var exclusions = ["a", "b", "c"];

  var exclusionInput = "if (url.indexOf('";

  for (var i = 0; i < exclusions.length; i++) {
    if (exclusions.length - i == 1) {
      var exclusion = exclusions[i];
      var exclusionString = exclusion.toString();
      exclusionInput = exclusionInput + exclusionString + "') != -1)  {toExclude.push(url); Logger.log(url) }";
    } else {
      var exclusion = exclusions[i];
      var exclusionString = exclusion.toString();
      exclusionInput = exclusionInput + exclusionString + "') != -1 || url.indexOf('";
    }   
  }

Проблема в том, что это работает, только если я позже сделаюeval:

eval(exclusionInput);

(по крайней мере, насколько я вижу, это не сработает, если я просто добавлю в exclusionInput сам по себе).

Этот код до сих пор работал отлично, но в моих поисках того, как это сделать, все говорили, что я должен стараться никогда не использовать eval, если это возможно.Основное беспокойство вызывает безопасность, которая на самом деле не является проблемой, поскольку все это находится в оболочке Google Ads и будет использоваться только сотрудниками моего агентства, но я все еще задавался вопросом, есть ли лучший способ добиться этого, который неТребовать Eval.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Если я правильно понимаю, что вы пытаетесь сделать, вы можете использовать функцию для построения функции для оценки вашего утверждения.Итак, шаги на этом:

  1. Объявите URL-адрес как переменную
  2. Создайте свой оператор возврата (он же ifs)
  3. Создайте функцию и запустите ее

Этот подход, как правило, является более безопасной альтернативой eval JS, поскольку все объявляется как переменная.

Надеюсь, это поможет.

const exclusions = ['a', 'a', 'a'];
const exclusions2 = ['a', 'b', 'c'];
const url = 'http://url-to-be-excluded.com';

const myEval = (array, url) => {

    let functionString = `const url = '${url}'; return (`;

    array.forEach((item) => functionString += `(url.indexOf('${item}') !== -1) || `);

    functionString += `false)`;
    
    // Create and run the function to evaluate
    
    return new Function(functionString)();
};

console.log(myEval(exclusions, url));
console.log(myEval(exclusions2, url));
0 голосов
/ 27 сентября 2018

Я думаю, вам не нужно создавать оператор IF программно.Смотрите это:

var exclusions = ['a', 'a', 'a'];
var exclusions2 = ['a', 'b', 'c'];

var url = 'http://url-to-be-excluded.com';

function shouldIExclude(exclusions, url) {
  return exclusions.map(exclusion => url.includes(exclusion)).some(b => b);  
}

console.log(shouldIExclude(exclusions, url));
console.log(shouldIExclude(exclusions2, url));
...