js修改拼接字符串为特定格式

现在有一个URL需要拼成白班:2:3:5,夜班:3:4:6这种格式,是动态增删生成的,这是两行数据,每行中间用逗号分隔,直接取的表单里面的值。
但是我用$("#form1").serialize()只能得到a=白班&b=2&c=3&d=5&a=夜班&b=3&c=4&d=6这种样子的数据。请问有什么办法能变成上面需要的样子吗?

<form id="form1">
    <label>工作种类:</label>
    <select name="a">
        <option>白班</option>
        <option>夜班</option>
    </select>
    <input type="text" name="b" value="2">
    <input type="text" name="c" value="3">
    <input type="text" name="d" value="5">
</form>

我的想法是替换&符号然后拆开,删掉每个部分的前两个字符,最后再重新拼起来,但是怎么也拼不出来:

var cc=$("#form1").serialize();//针对多行的时候cc='a=白班&b=2&c=3&d=5&a=夜班&b=3&c=4&d=6';
var dd=cc.replace(/=/g,"");//去掉等于号
var bbb=dd.split(":");//从冒号开始拆分
for(var i in bbb) {//往下就出错了
    var ccc=bbb[i];
    var ddd=ccc.slice(2);
    var str="";
    console.log(str.concat(ddd));
};

有人推荐用正则,但是正则对于多行的时候好像就没有办法很好的拼接了,我的name是可以为a-z的字母的,最后在拼出来的url里面是不需要name的。

阅读 4.1k
5 个回答

其实正则是最优解。

2333,手动滑稽。

var a="a=白班&b=2&c=3&d=5";
a.replace(/(\&?)(\w*\=)/g, (a, b) => { return b ? ':' : '' });

更新
应题主的要求

var a="a=白班&b=2&c=3&d=5&a=夜班&b=2&c=3&d=5";
a.replace(/(\&?)(\w*\=)([\w|\u4e00-\u9fa5]*)/g, (a, b, c, d) => {
  if (d === '夜班') return ',' + d;
  return (b ? ':' : '') + d
});
'a=白班&b=2&c=3&d=5'.split('&').map(item => item.split('=')[1]).join(':')

可以用正则

var a="a=白班&b=2&c=3&d=5";    
var b=a.replace(/[a-z\=]/g,"").replace(/\&/g,":")
console.log(b)

不知道正则可以不可以一步解决,暂时没想出来。。

回到你的问题,你循环用的for in !数组不建议用这种方法。。直接for循环为好,当然在你这里结果没有差别;

for(var i in bbb) {
    var ccc=bbb[i];
    var ddd=ccc.slice(2);
    var str="";//重复定义str为空
    console.log(str.concat(ddd));//另外concat方法返回的是新的字符串,str是不会变的
};

按照你的需求的,你可以这么去改比较好一点

var b = $('form').serializeArray();
var temp = [];
var c = '';
for(var n in b) {
    temp.push(b[n]);
}
c = temp.join(':');
'a=白班&b=2&c=3&d=5'
    .split(/=|&/) // split之后字符数组为['a', '白班', 'b', '2', 'c', '3', 'd', '5']
    .filter((i, index) => index % 2 === 1) // 我们需要的值都在奇数index中,这个方法进行过滤
    .join(':');
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题