[英]Sort array by custom function in JavaScript
我只使用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 =愛麗絲
因此,我認為一種方法是按此數字對數組進行排序。 然后在排序后將每2個值連接在一起。
我嘗試了以下代碼:
strSplit.sort(function() {
var pref = strSplit[i].split('=')[0];
return pref.charAt(pref.length-1);
});
它似乎不起作用
任何幫助,將不勝感激
您可以按照以下步驟進行操作。
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('|'))
您可以拆分各部分,收集所有項目並返回一個連接的字符串。
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);
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)
一個想法是先在&
上分割值,然后將其添加為數字作為鍵並放在對象上,然后再將各自的值以所需格式放置
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)
您可以將&
轉換為字符串,然后刪除?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]);
編輯:對於那些尋求最佳性能解決方案的人,值得一提,我已經測試了此處提供的所有解決方案,請單擊此處獲取更多信息。
該解決方案的列表從最快到最慢:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.