JS - 将this.property(event.target.property)链接到变量名称(不带eval())

时间:2018-01-15 12:56:58

标签: javascript validation variables eval dry

我正在编写一个简单的客户端表单验证代码。我正在尝试创建具有属性的对象&验证过程中使用的值(对于每个单独的输入),然后将它们附加到输入节点。

我正在尝试找到一种方法将这些对象自动配对到各自的输入。在下面的代码中,我找到了一种方法来执行此操作,但是要使用eval()函数,我宁愿避免使用它。在JS中还有其他方法吗?

<label class="c-contact-form__label" for="your_name">Your Name *</label>
<input class="" type="text" name="your_name" maxlength="50" size="30">    
var your_name = {
  regex: /^([a-z\u00C0-\u02AB,.'´`]{1,}\.?\s?)([a-z\u00C0-\u02AB,.'´`]?\.?\s?)+$/i,
  required: true,
  invalid: "Your name seems a little bit weird…",
  empty: "Please, fill in your name."
};

// From within a function of eventListener:

var Merged = Object.assign(this, eval(this.name)); // Use of eval()
console.log(Merged.invalid); // "Your name seems a little bit weird…",

我正在谷歌搜索解决方案非常努力,我已经阅读了可能的上下文[varName]解决方案,但它似乎不起作用(或者我没有得到它)​​。

2 个答案:

答案 0 :(得分:0)

您可以使用eval()或context [varName]。如果你需要它是全局的,上下文可以是带var,const或let或直接窗口[varName]的变量。

答案 1 :(得分:0)

问题是原始代码包含在IIFE中。因此 - AFAIK - 它不能用括号表示法加入,因为它不存在于全局范围内,并且对象本身没有父符号。

const foo = (() => {
  let bar = 'obj';
  const obj = {
    // not accessible by [var]whatever. AFAIK
    whatever: 'bar',
  } 
  console.log([bar].whatever); // undefined
})();

我通过将对象包装到父对象中来解决它:

const foo = (() => {
  let bar = 'obj';
  const parent = {
    //now accessible by parent[bar].
    obj: {
      whatever: 'bar',
    }
  }
  console.log(parent[bar].whatever); // bar
})();