Javascript 循环遍历对象以查找输入名称

Javascript 循环遍历对象以查找输入名称,javascript,jquery,Javascript,Jquery,我有两个类似的输入: <input name="education[1][yearbegin]" type="date" class="form-control"> <input name="education[2][yearbegin]" type="date" class="form-control"> 我并不总是得到多于1的返回,有时可能会有很多,我试图循环向输入添加错误,如下所示: var errors = $.parseJSON(data.responseTe

我有两个类似的输入:

<input name="education[1][yearbegin]" type="date" class="form-control">
<input name="education[2][yearbegin]" type="date" class="form-control">
我并不总是得到多于1的返回,有时可能会有很多,我试图循环向输入添加错误,如下所示:

var errors = $.parseJSON(data.responseText);
alertHtml += '<ul>';
$.each(errors, function (key, value) {
    $('.form-control[name=' + key + ']').closest('.form-group').addClass('has-error');
    alertHtml += '<li>' + value + '</li>';
});
alertHtml += "</ul>";
而不是

education[1]yearbegin

我的输入不会总是排列的,但是那些没有附加的输入我如何通过更改javascript将错误消息附加到输入中?json由Laravel的数组验证发回。不幸的是,服务器以一种形式接受名称,但以另一种形式发回

如果我们假设点语法应始终转换为方括号语法,则更新键相当简单:

var updated = key.split(".");
if (updated.length == 1) {
  updated = updated[0];
} else {
  updated = updated[0] + "[" + updated.slice(1).join("][") + "]";
}
对于多部分键,在第二部分之前插入
[
,在第二部分和第三部分、第三部分和第四部分之间插入
[
,以此类推;并在末尾添加
]

例如:

var错误=[
{“education.1.yearbegin”:[“education.1.yearbegin字段为必填项],
{“education.2.yearbegin”:[“education.2.yearbegin字段是必需的。”]}
];
errors.forEach(函数(错误){
Object.keys(错误).forEach(函数(键){
var updated=键拆分(“.”);
if(updated.length==1){
已更新=已更新[0];
}否则{
updated=updated[0]+“[”+updated.slice(1).join(“][”+“]);
}
控制台日志(“原始:“+key+”,更新:“+updated”);
});

});名称为的第一个问题:

我只想把名字改成更容易阅读的名字,而不是像这样:

name="education[1][yearbegin]"
也许你会喜欢:

name="EducationYearBegin1"
第二期:

您可以检查属性是否为数组,如下所示:

if (value instanceof Array) {
    value.forEach(function (item) {
        alertHtml += '<li>' + item + '</li>';
    })
} else {
    alertHtml += '<li>' + value + '</li>';

}
if(数组的值实例){
value.forEach(函数(项){
alertHtml+='
  • '+item+'
  • '; }) }否则{ alertHtml+='
  • '+value+'
  • '; }
    也许是那样的

    如果您的数组中也有多个错误,foreach将为您提供保护。

    您可以使用它将
    教育。1.yearbegin
    转换为
    教育[1][yearbegin]

    请参阅此代码中的
    fixName
    函数

    函数fixName(名称){
    var newName=name.replace(/\.\d\./,函数($1){
    返回“[”+$1.replace(/\./g,”)+“]
    }).replace(/\].+/,函数($1){
    返回$1。替换(/\]/,“][”+“]”)
    });
    返回newName;
    }
    var errors=[{“education.1.yearbegin”:[“education.1.yearbegin字段是必需的。”]},
    {“education.2.yearbegin”:[“education.2.yearbegin字段是必需的。”]}];//$。parseJSON(data.responseText);
    var alertHtml=document.querySelector(“警报”);
    alertHtml.innerHTML+='
      '; $。每个(错误、功能(键、obj){ var realKey=fixName(Object.keys(obj)[0]); $('.form控件[name=“'+realKey+''“]).addClass('has-error'); alertHtml.innerHTML+='
    • '+obj[Object.keys(obj)[0]][0]+'
    • '; }); alertHtml.innerHTML+=“
    。有错误{
    颜色:红色;
    }
    李{
    颜色:绿色
    }
    
    
    我认为您有两个问题,对吗。1:名称不正确?2:如果是数组,你需要正确地追加错误?没错,@JamesDale,而不是[1]它是。1.根据这一建议,输入将不再是数组,无法像数组服务器端那样访问。是的,请使用下面的答案:)当我控制台记录我的错误时,我似乎无法实现这一点,我得到了以下对象,并且出现了一个错误:@randomman:您正在使用单个对象作为起点。上面使用了一个数组,因为你在问题中清楚地引用了你得到的不止一个数组。请参阅我对问题的评论以及答案中的示例。很抱歉,我已使用收到的格式更新了我的OP,@randomman:然后您只需删除最外层的
    $。每个
    。我已经更新了答案。
    
    name="EducationYearBegin1"
    
    if (value instanceof Array) {
        value.forEach(function (item) {
            alertHtml += '<li>' + item + '</li>';
        })
    } else {
        alertHtml += '<li>' + value + '</li>';
    
    }