遍历JSON数据,数据格式特殊怎么处理?

后端返回一组数据,其中有一项是这样的:

 "oneWeekAll": "{weekStart:2017-11-13,weekEnd:2017-11-19};{weekStart:2017-11-06,weekEnd:2017-11-12};{weekStart:2017-10-30,weekEnd:2017-11-05};"
 

我要如何转成正常的数组以方便循环遍历呢?
这里面每个大括号都是用分号间隔的,并且一整串在一个双引号内,搞得我有点乱套。求助大神,谢谢

附上后台返回的全部数据:

AuditRetCode:"1"
AuditRetVal:"success"
RetCode:"1"
RetVal:"1"
oneWeekAll:"{weekStart:2017-11-13,weekEnd:2017-11-19};{weekStart:2017-11-06,weekEnd:2017-11-12};{weekStart:2017-10-30,weekEnd:2017-11-05};"

我要的东西在 oneWeekAll 里

阅读 2.9k
4 个回答

要简单点的话,就这样:

const oneWeekAll = "{weekStart:2017-11-13,weekEnd:2017-11-19};{weekStart:2017-11-06,weekEnd:2017-11-12};{weekStart:2017-10-30,weekEnd:2017-11-05};";

const result = oneWeekAll.split(';').filter(item => item).map(item => {
  const str = item.replace(/\{|\}/g, '')
  const arr = str.split(/\:|\,/)
  return {
    weekStart: arr[1],
    weekEnd: arr[3]
  }
});

console.log(result);

谢邀, @Ash_Shen 的回答满分,我稍稍改了一下(没啥实际意义,也不知道性能如何)

const all = "{weekStart:2017-11-13,weekEnd:2017-11-19};{weekStart:2017-11-06,weekEnd:2017-11-12};{weekStart:2017-10-30,weekEnd:2017-11-05};";

const list = all.split(";")
    .filter(t => t)
    .map(t => t.split(/[{},:]/))
    .map(parts => ({
        [parts[1]]: parts[2],
        [parts[3]]: parts[4]
    }));

然后还写了一个比较搞笑的版本(性能肯定不怎么样)

const all = "{weekStart:2017-11-13,weekEnd:2017-11-19};{weekStart:2017-11-06,weekEnd:2017-11-12};{weekStart:2017-10-30,weekEnd:2017-11-05};";

const json = all
    .replace(/;?$/, "")
    .replace(/,/g, "\",\"")
    .replace(/:/g, "\":\"")
    .replace(/;/g, ",")
    .replace(/\{/g, "{\"")
    .replace(/\}/g, "\"}");

const list = JSON.parse(`[${json}]`);

补充一下,上面最后一种肯定是很慢的,不过在 jsPerf 上测试第1种比 @Ash_Shen 的答案慢 35% 左右,尝试把两个 map 合并成一个 map,作用不大,但是改了一个对象的 key,速度一下子就起来了,居然提升了 150% (也就是2.5倍)

const list = all.split(";")
    .filter(t => t)
    .map(t => {
        const parts = t.split(/[{},:]/);
        return {
            weekStart: parts[2],
            weekEnd: parts[4]
        };
    });

split(";")

var arr = res.oneWeekAll.split(";") //这样就把这串字符 分割成了以;为断点的数组
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题