为什么把yyyy-MM-DD的正则放到$.each方法中循环匹配没有效果?(见代码)

$.ajax({
    url:"../json/month_drop.json",
    type:"get",
    async:false,
    dataType:'json',
    beforeSend:function(){},
    success:function(data){
        if(data.code == 100){
            if(data.content){
                var opsdata = data.content;

                $.each(opsdata,function(i,obj){
                    var reg = /^(\d{4})-(\d{2})-(\d{2})$/g;
                    console.log($(this)[i] == opsdata[i]);
                        console.log($(this)[i].orderMonth.substr(0,9).replace(reg,"$1年$2月$3日"));
                    // var ymd = opsdata[i].orderMonth;
                    // var dropdate = ymd.match(reg);
                    // var curdate = opsdata[i].orderMonth.substr(0,9);
                    // var curdate = "2016-01-23";
                    // var sss = opsdata[i].orderMonth.substr(0,9).replace(reg,"$1年$2月$3日");
                    // console.log(sss);
                    // console.log(dropdate);
                    // console.log(opsdata[i].orderMonth.substr(0,9));
                    // console.log(opsdata[i].cname);
                    // $("<option value='"+opsdata[i].cname+"'>"+opsdata[i].cname+"</option>").appendTo("#mth-box");
                });
            }
        }
    },
    error:function(data){
        alert("error");
    }
})

console.log($(this)[i] == opsdata[i]);// 第一次输出的是true,第二次就是false 为什么会这样?

模拟格式:

{

"code":100,
"content":[
    {
        "id":54,
        "orderMonth":"2016-12-29 14:33:20"
    },
    {
        "id":156,
        "orderMonth":"2016-11-29 14:36:13"
    }
],
"message":"成功" }

var reg = /^(d{4})-(d{2})-(d{2})$/g;
测试的时候是可以的!为什么放到$.each中循环匹配就不行?

阅读 2.8k
4 个回答

第一种方案: 把全局的g去掉

第二种方案: 每次匹配之后,把reg.lastIndex = 0;

因为lastIndex是规定下一次匹配的起始位置

循环es6:

opsdata.each((index,item)=>{
    ...
});

这样不会出现索引永远是最后一个的问题,

不过正则的问题lastIndex是正确的

你先明白$.each 里面的 this 是啥
这里的this 其实就是 $.each(opsdata,function(i,obj){} 中的obj
说白了就是 你 遍历的 content 里面的每一个对象
你又用 $(this)[i] 之所有第一次是成功的 是因为 $(this) 把你这个对象包装了一下
但是其实里面只有一个 属性,由于第一次 i 的值是 0 所以是能取到值的
第二次之所以是 false 是因为 这个时候 i的值是1 $(this) 里面只有一个属性,你用 1 肯定取不到值

你直接用 obj 或者 直接用 this 不要用$去包装

你在console中执行一下面这段代码:

$.each(opsdata,function(i,obj){
  var reg = /^(\d{4})-(\d{2})-(\d{2})$/g;
  console.log($(this) == opsdata[i]);
  console.log($(this));
  console.log($(this)[i]);
  console.log(i)
})

因为this是根据上下文执行环境来确定的,所以$(this)是指向data.content[0/1]并不是指向data.content,所以在第二次循环i=1时,实际指向的是data.content[1][1]为underfined,所以才会报错.

 var opsdata = [{
        "id": 54,
        "orderMonth": "2016-12-29 14:33:20"
    }, {
        "id": 156,
        "orderMonth": "2016-11-29 14:36:13"
    }];
    $.each(opsdata, function(i, obj) {
        //既然用正则了,就把后面的全部干掉
        var reg = /^(\d{4})-(\d{2})-(\d{2}).*$/g;
        console.log(this);//this指向每个obj
        console.log($(this))//这里你用jquery包装了下,变成了[obj]。这里是个数组,length为1,所以第一次[obj][0]是可以取到的,但是[obj][1]是没有值的
        obj.orderMonth=obj.orderMonth.replace(reg, "$1年$2月$3日");
    });
    console.log(opsdata)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题