如何合并json字符串中相同key的value?

预备程序员 2017-08-21 07:23:13
jsondata={“身高”:“175cm”, “性别”:“男”,“兴趣”:“唱歌”,“兴趣”:“棒球”,“兴趣”:“游泳”}

如何合并其中同key的value如这样:

jsondata={“身高”:“175cm”, “性别”:“男”,“兴趣”:“唱歌,棒球,游泳”}
...全文
658 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
文盲老顾 2017-08-22
  • 打赏
  • 举报
回复
if(typeof(o[arr[0]])=='string'){o[arr[0]]=[o[arr[0]]]}; o[arr[0]].push(arr[1]) 换成 o[arr[0]]+-arr[1] 即可
文盲老顾 2017-08-21
  • 打赏
  • 举报
回复

for(var o={},s = 'jsondata={"身高":"175cm","性别":"男","兴趣":"唱歌","兴趣":"棒球","兴趣":"游泳"}',m=s.match(/"[^"]+":"[^"]+"/gi),i=0;i<m.length;i++){
    var kv = m[i].match(/"[^"]+"/gi),arr = [];
    for(var j=0;j<kv.length;j++){
        arr.push(kv[j].replace(/"/g,''))
    };
    if(arr[0] in o){
        if(typeof(o[arr[0]])=='string'){o[arr[0]]=[o[arr[0]]]};
        o[arr[0]].push(arr[1])
    }else{
        o[arr[0]]=arr[1]
    }
};
console.log(o);
Go 旅城通票 2017-08-21
  • 打赏
  • 举报
回复
键名称一样最后一个出现的键值会覆盖前面的,你只能字符串+正则来获取,而且这个字符串都是错了,符号都是中文状态的

    var s = 'jsondata={"身高":"175cm","性别":"男","兴趣":"唱歌","兴趣":"棒球","兴趣":"游泳"}'
    var kv = {}, m, reg = /"([^"]+)":"([^"]+)"/g;
    while (m = reg.exec(s)) { kv[m[1]] ? kv[m[1]] = (typeof kv[m[1]] == 'string' ? [kv[m[1]]] : kv[m[1]]).concat([m[2]]) : kv[m[1]] = m[2] }
   alert(JSON.stringify(kv))


推荐学习资料
jqGrid表单编辑配置
javascript运行机制浅析
预备程序员 2017-08-21
  • 打赏
  • 举报
回复
引用 2 楼 superwfei 的回复:

for(var o={},s = 'jsondata={"身高":"175cm","性别":"男","兴趣":"唱歌","兴趣":"棒球","兴趣":"游泳"}',m=s.match(/"[^"]+":"[^"]+"/gi),i=0;i<m.length;i++){
    var kv = m[i].match(/"[^"]+"/gi),arr = [];
    for(var j=0;j<kv.length;j++){
        arr.push(kv[j].replace(/"/g,''))
    };
    if(arr[0] in o){
        if(typeof(o[arr[0]])=='string'){o[arr[0]]=[o[arr[0]]]};
        o[arr[0]].push(arr[1])
    }else{
        o[arr[0]]=arr[1]
    }
};
console.log(o);
这个json对象stringify后的结果是: {"身高":"175cm","性别":"男","兴趣":["唱歌","棒球","游泳"]} 怎样变成下面这样呢 {"身高":"175cm","性别":"男","兴趣":"唱歌,棒球,游泳"} 我的思路是正则替换掉[ ]之间的","为, 然后在replace掉[和],不过前面的正则匹配应该怎么写呢?
Go 旅城通票 2017-08-21
  • 打赏
  • 举报
回复
那个是数组,你不要数组直接字符串链接就好了
while (m = reg.exec(s)) { kv[m[1]] = (kv[m[1]] ? kv[m[1]] +',':'')+ m[2] }
预备程序员 2017-08-21
  • 打赏
  • 举报
回复
引用 1 楼 showbo 的回复:
键名称一样最后一个出现的键值会覆盖前面的,你只能字符串+正则来获取,而且这个字符串都是错了,符号都是中文状态的

    var s = 'jsondata={"身高":"175cm","性别":"男","兴趣":"唱歌","兴趣":"棒球","兴趣":"游泳"}'
    var kv = {}, m, reg = /"([^"]+)":"([^"]+)"/g;
    while (m = reg.exec(s)) { kv[m[1]] ? kv[m[1]] = (typeof kv[m[1]] == 'string' ? [kv[m[1]]] : kv[m[1]]).concat([m[2]]) : kv[m[1]] = m[2] }
   alert(JSON.stringify(kv))
推荐学习资料 jqGrid表单编辑配置 javascript运行机制浅析
这样输出结果是:{"身高":"175cm","性别":"男","兴趣":["唱歌","棒球","游泳"]} 我想得到这样的结果;{"身高":"175cm","性别":"男","兴趣":唱歌,棒球,游泳"} 貌似需要先将硬括号范围内的","替换成, 然后再剔除硬括号,才能得到上面的结果。最后的剔除硬括号我倒是会,不过前面的正则匹配应该怎么写呢?
75闪光雷 2017-08-21
  • 打赏
  • 举报
回复
循环判断呗, key值相等, value+=newValue;

87,903

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧