尝试在IE中模拟JavaScript动态属性时遇到了问题

尝试在IE中模拟JavaScript动态属性时遇到了问题,javascript,jquery,jquery-validate,ecmascript-5,Javascript,Jquery,Jquery Validate,Ecmascript 5,我有一些使用jQuery.validate的JavaScript。这将获取从服务器返回的JSON对象,并将其传递给showErrors函数。response.errors对象如下所示 {[ { item1: "Email", item2: "Invalid format" }, { item1: "ExpiryDate", item2: "Must be in the future" } ]{ 以下ES6代码工作正常 for(var i = 0; i < response.err

我有一些使用jQuery.validate的JavaScript。这将获取从服务器返回的JSON对象,并将其传递给
showErrors
函数。
response.errors
对象如下所示

{[
  { item1: "Email", item2: "Invalid format" },
  { item1: "ExpiryDate", item2: "Must be in the future" }
]{
以下ES6代码工作正常

for(var i = 0; i < response.errors.length; i++) {
  $('form').validate()
    .showErrors({ [response.errors[i].item1]: response.errors[i].item2 });
}
然而,尽管转储
error
和以前的控制台代码显示它们是相同的,但当我尝试使用此代码时,控制台中出现了一个错误

未捕获(承诺中)TypeError:无法读取未定义的属性“type” 位于$.validator.highlight(jquery.validate.js:344) 位于$.validator.DefaultBarrors(jquery.validate.js:912) 位于$.validator.rors(jquery.validate.js:546) handleServerResponse(捐赠:305)

问题中的这一行是我调用的
showErrors

有人能帮我吗

更新只是为了澄清一下,我在循环中执行此操作的原因是服务器端代码返回三种类型的错误,与特定输入元素相关的正常错误,与整个数据相关的一般错误,以及与表单的付款部分相关的错误。我只将第一种类型传递给
jQuery.validate
,因为第二种类型显示在表单的独立部分,而第三种类型的处理方式必须有所不同,因为支付处理器在
iframe
中生成自己的HTML,这意味着我必须手动添加错误


第二次更新结果是页面的某个单独部分上的一些代码抛出了我的JavaScript。我拥有的代码,以及两个答案中显示的代码都很好,这是一个单独的问题。

要构建对象,您可以使用一个循环通过从AJAX请求接收的数组,然后通过使用括号表示法向对象添加属性,您可以将其传递到
showErrors()
,如下所示:

var errors={};
response.errors.forEach(函数(err){
错误[err.item1]=err.item2
});
$('form').validate().showErrors(错误);

要构建对象,您可以通过从AJAX请求接收的数组使用循环,然后通过使用括号表示法向对象添加属性,您可以将其传递给
showErrors()
,如下所示:

var errors={};
response.errors.forEach(函数(err){
错误[err.item1]=err.item2
});
$('form').validate().showErrors(错误);
类似于,但我将使用
response.errors
数组,并将其转换为属性位于正确位置的数组

注意,该函数具有键/值对,这些键/值对是要显示的输入名称和消息,因此不需要在循环中调用它

var错误=[
{item1:“电子邮件”,item2:“无效格式”},
{item1:“到期日”,item2:“必须在未来”}
];
var errorsToShow=/*response.*/errors.reduce((arr,cur)=>{
arr[cur.item1]=cur.item2;
返回arr;
}, {});
console.log(errorsToShow);
//$('form').validate().showErrors(errorsToShow)类似于,但我将使用
response.errors
数组,并将其转换为属性位于正确位置的数组

注意,该函数具有键/值对,这些键/值对是要显示的输入名称和消息,因此不需要在循环中调用它

var错误=[
{item1:“电子邮件”,item2:“无效格式”},
{item1:“到期日”,item2:“必须在未来”}
];
var errorsToShow=/*response.*/errors.reduce((arr,cur)=>{
arr[cur.item1]=cur.item2;
返回arr;
}, {});
console.log(errorsToShow);

//$('form').validate().showErrors(errorsToShow)这不是你代码中的问题,你在这里使用的库
jquery.validate.js
正在创建错误,可能它是用ES6编写的。这不是你代码中的问题,你在这里使用的库
jquery.validate.js
正在创建错误,也许是用英文写的es6@adiga具有键/值对,这些键/值对是要显示的输入名称和消息。@HereticMonkey OK。刚才提到,因为OP说多次调用
.batherrors()
的ES6代码工作正常。@Rory谢谢,但这是我尝试过的事情之一,并且得到了我提到的错误。我将
errors
对象转储到控制台,它看起来很好。这就是我被卡住的地方。有什么想法吗?再次感谢提供此解决方案有效问题中显示的信息:。请注意,我确实修复了您显示的对象中的一些语法问题,因为它是无效的。也许可以检查控制台以确保没有其他语法errors@RoryMcCrossan从我更新的答案中可以看出,您显示的代码运行良好,问题出在其他地方。很难在你的答案和异端猴子的答案之间做出选择,但我选择了你的答案是因为它的简单性。@adiga的键/值对是输入名称和要显示的消息。@HereticMonkey好的。刚才提到,因为OP说多次调用
.batherrors()
的ES6代码工作正常。@Rory谢谢,但这是我尝试过的事情之一,并且得到了我提到的错误。我将
errors
对象转储到控制台,它看起来很好。这就是我被卡住的地方。有什么想法吗?再次感谢提供此解决方案有效问题中显示的信息:。请注意,我确实修复了您显示的对象中的一些语法问题,因为它是无效的。也许可以检查控制台以确保没有其他语法errors@RoryMcCrossan从我更新的答案中可以看出,您显示的代码运行良好,问题出在其他地方。很难在你的答案和异端猴子的答案之间做出选择,但我选择了你的答案,因为它简单。谢谢你的回答,但这不起作用。请看我对罗里回答的评论。我还更新了这个问题来解释我为什么使用循环。无论如何,谢谢你,还有什么想法吗?嗯,问一个问题,然后改变问题是不公平的
var error = {};
error[response.errors[i].item1] = response.errors[i].item2;
$('form').validate().showErrors(error);