javascript - 为什么把yyyy-MM-DD的正则放到$.each方法中循环匹配没有效果?(见代码)
怪我咯
怪我咯 2017-04-11 11:06:03
[JavaScript讨论组]
$.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);
                    // $("").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中循环匹配就不行?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(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 不要用$去包装

PHP中文网

你在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)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号