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

Best way to dynamically create an if statement in JavaScript?

我正在编写将在代理机构内使用的 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 广告 shell 中并且只会被我机构的员工使用,但我仍然想知道是否有更好的实现这一目标的方法不需要 eval。

我认为您不需要以编程方式创建 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. 将 url 声明为变量
  2. 建立你的 return 声明(又名你的 ifs)
  3. 创建函数并运行它

这种方法通常比 JS 的 eval 更安全,因为所有内容都声明为变量。

希望对您有所帮助。

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));