我正在编写一个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外壳程序内,并且只会由我的代理商的员工使用,但是我仍在想是否有更好的方法来实现这一目标?需要评估。
答案 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)
如果我正确理解您要执行的操作,则可以使用一个函数来构建一个函数来评估您的语句。因此,此步骤的步骤是:
由于所有内容都声明为变量,因此这种方法通常是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));