在 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));
如果我理解正确你想做什么,你可以使用一个函数来构建一个函数来评估你的语句。所以这一步的步骤是:
- 将 url 声明为变量
- 建立你的 return 声明(又名你的 ifs)
- 创建函数并运行它
这种方法通常比 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));
我正在编写将在代理机构内使用的 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));
如果我理解正确你想做什么,你可以使用一个函数来构建一个函数来评估你的语句。所以这一步的步骤是:
- 将 url 声明为变量
- 建立你的 return 声明(又名你的 ifs)
- 创建函数并运行它
这种方法通常比 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));