在JavaScript中动态创建if语句的最佳方法?

时间:2018-09-27 09:48:14

标签: javascript google-adwords

我正在编写一个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(exclusionInput);

(至少据我所知,如果我自己添加exclusionInput,则它不起作用)。

到目前为止,该代码可以正常运行,但是在搜索操作方法时,每个人都在说,如果可能,我应该尽量不要使用eval。主要关注的是安全性,这在这里并不是真正的问题,因为它全部在Google Ads外壳程序内,并且只会由我的代理商的员工使用,但是我仍在想是否有更好的方法来实现这一目标?需要评估。

2 个答案:

答案 0 :(得分:2)

我认为您不需要以编程方式创建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));

答案 1 :(得分:0)

如果我正确理解您要执行的操作,则可以使用一个函数来构建一个函数来评估您的语句。因此,此步骤的步骤是:

  1. 将网址声明为变量
  2. 建立您的退货声明(又称ifs)
  3. 创建函数并运行

由于所有内容都声明为变量,因此这种方法通常是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));