我只使用Javascript。
我有以下字符串:
?pn1=age&pn2=name&pv1=12&pv2=alice
我需要做的是得到以下结果:
age:12|name:alice
我想到了一种方法,它是这样的:
var str = "?pn1=age&pn2=name&pv1=12&pv2=alice";
var strSplit = str.split("&");
for (var i = 0; i < strSplit.length; i++) {
console.log(strSplit[i]);
}
这将返回以下结果:
?pn1=age
pn2=name
pv1=12
pv2=alice
由于我要加入 pn1 和 pv1 和 pn2 和 pv2 ,因此字符串的结尾很重要。
?pn 1 =年龄
pn 2 =名称
pv 1 = 12
pv 2 = alice
因此,我认为一种实现方法是按此数字对数组进行排序。然后在排序后将每2个值连接在一起。
我尝试了以下代码:
strSplit.sort(function() {
var pref = strSplit[i].split('=')[0];
return pref.charAt(pref.length-1);
});
它似乎不起作用
任何帮助将不胜感激
答案 0 :(得分:2)
您可以按照以下步骤进行操作。
i
是循环遍历半数组时的当前索引。 i
上的元素将是关键。i
中以获得相应的值。split()
=
键和值,并获取第二个元素。
var str = "?pn1=age&pn2=name&pv1=12&pv2=alice";
var arr = str.split("&");
let half = arr.length/2
let res = [];
for (var i = 0; i < half; i++) {
res.push(`${arr[i].split('=')[1]}:${arr[i + half].split('=')[1]}`);
}
console.log(res.join('|'))
答案 1 :(得分:2)
您可以拆分各部分,收集所有项目并返回一个连接的字符串。
var string = '?pn1=age&pn2=name&pv1=12&pv2=alice',
result = string
.slice(1)
.split('&')
.reduce((r, p) => {
var [k, value] = p.split('='),
[key, index] = k.split(/(\d+)/);
index--;
r[index] = r[index] || {};
r[index][key] = value;
return r;
}, [])
.map(({ pn, pv }) => [pn, pv].join(':'))
.join('|');
console.log(result);
答案 2 :(得分:2)
URLSearchParams
将查询字符串转换为键值对的集合。 pv
和pn
值分组。 (\D+)(\d+)
obj.pn
并获得相同数字的相应pv
值|
这适用于任意随机顺序的pn
和pv
值
const searchParams = new URLSearchParams("?pn1=age&pn2=name&pv1=12&pv2=alice")
const obj = { pn: {}, pv: {} }
for (let [key, value] of searchParams) {
const [, k, number] = key.match(/(\D+)(\d+)/)
obj[k][number] = value
}
const output = Object.entries(obj.pn)
.map(([n, key]) => `${key}:${obj.pv[n]}`)
.join("|")
console.log(output)
答案 3 :(得分:0)
一个想法是先在&
上分割值,然后将其添加为数字作为键并放置在对象上,然后再将各个值以所需的格式放置
var str = "?pn1=age&pn2=name&pv1=12&pv2=alice".replace(/^\?/,'')
var strSplit = str.split("&");
let op = strSplit.reduce((op,inp) => {
let [key,value] = inp.split('=')
let digit = key.match(/\d+/)[0]
op[digit] = op[digit] || []
op[digit].push(value)
return op
},{})
let final = Object.values(op).reduce((op,inp) => {
let [key,value] = inp
op.push(`${key}:${value}`)
return op
} ,[]).join(' | ')
console.log(final)
答案 4 :(得分:0)
您可以将&
拆分为字符串,然后删除?xxx=
,然后再按,
拆分,最后得到一个包含您要查找内容的数组。
var str = "?pn1=age&pn2=name&pv1=12&pv2=alice";
var split = str.split('&').toString().replace(/([?]?[pnv0-9]+[=])/g,'').split(',');
console.log(split[0] + ':' + split[2] + '|' + split[1] + ':' + split[3]);
编辑::对于那些寻求最佳性能解决方案的人来说值得一提,我已经测试了此处提供的所有解决方案,请点击here以获取更多信息。
从最快到最慢的解决方案列表: